Example #1
0
        internal string GetUrl(bool ensureUserCanAccessResource, bool ensureResourceNotDisabled, bool makeAbsolute)
        {
            var url = buildUrl() + uriFragmentIdentifier.PrependDelimiter("#");

            if (ensureUserCanAccessResource && !UserCanAccessResource)
            {
                throw new ApplicationException("GetUrl was called for a resource that the authenticated user cannot access. The URL would have been " + url + ".");
            }
            if (ensureResourceNotDisabled && AlternativeMode is DisabledResourceMode)
            {
                throw new ApplicationException("GetUrl was called for a resource that is disabled. The URL would have been " + url + ".");
            }
            if (makeAbsolute)
            {
                url = url.Replace("~", EwfApp.GetDefaultBaseUrl(ShouldBeSecureGivenCurrentRequest));
            }
            return(url);
        }
        private static Tuple <string, string, string> getNameAndDomainAndPath(string name, string domain, string path, bool omitNamePrefix)
        {
            var defaultAttributes = EwfConfigurationStatics.AppConfiguration.DefaultCookieAttributes;
            var defaultBaseUrl    = new Uri(EwfApp.GetDefaultBaseUrl(false));

            domain = domain ?? defaultAttributes.Domain ?? "";

            // It's important that the cookie path not end with a slash. If it does, Internet Explorer will not transmit the cookie if the user requests the root URL
            // of the application without a trailing slash, e.g. integration.redstapler.biz/Todd. One justification for adding a trailing slash to the cookie path is
            // http://stackoverflow.com/questions/2156399/restful-cookie-path-fails-in-ie-without-trailing-slash.
            path = path ?? defaultAttributes.Path;
            path = path != null ? "/" + path : defaultBaseUrl.AbsolutePath;

            // Ensure that the domain and path of the cookie are in scope for both the request URL and resource URL. These two URLs can be different on shortcut URL
            // requests, requests that transfer to the log-in page, etc.
            var requestUrls = new[] { AppRequestState.Instance.Url, EwfPage.Instance.InfoAsBaseType.GetUrl(false, false, true) };

            foreach (var url in requestUrls)
            {
                var uri = new Uri(url);
                if (domain.Any() && !("." + uri.Host).EndsWith("." + domain))
                {
                    throw new ApplicationException("The cookie domain of \"{0}\" is not in scope for \"{1}\".".FormatWith(domain, url));
                }
                if (path != "/" && !(uri.AbsolutePath + "/").StartsWith(path + "/"))
                {
                    throw new ApplicationException("The cookie path of \"{0}\" is not in scope for \"{1}\".".FormatWith(path, url));
                }
            }
            if (!domain.Any())
            {
                var requestHosts = requestUrls.Select(i => new Uri(i).Host);
                if (requestHosts.Distinct().Count() > 1)
                {
                    throw new ApplicationException(
                              "The cookie domain could arbitrarily be either {0} depending upon the request URL.".FormatWith(
                                  StringTools.ConcatenateWithDelimiter(" or ", requestHosts.ToArray())));
                }
            }

            return(Tuple.Create((omitNamePrefix ? "" : defaultAttributes.NamePrefix ?? "") + name, domain, path));
        }