示例#1
0
        private void rewritePathIfShortcutUrl()
        {
            var ewfResolvers = new[]
            {
                new ShortcutUrlResolver(
                    "ewf",
                    ConnectionSecurity.SecureIfPossible,
                    () => {
                    var page = MetaLogicFactory.CreateBasicTestsPageInfo();
                    return(page.UserCanAccessResource ? page : null);
                }),
                new ShortcutUrlResolver(
                    "ewf/impersonate",
                    ConnectionSecurity.SecureIfPossible,
                    () => {
                    if (!UserManagementStatics.UserManagementEnabled)
                    {
                        return(null);
                    }
                    var page = MetaLogicFactory.CreateSelectUserPageInfo("");
                    return(page.UserCanAccessResource ? page : null);
                })
            };

            var url = GetRequestAppRelativeUrl(Request);

            foreach (var resolver in ewfResolvers.Concat(GetShortcutUrlResolvers()))
            {
                if (resolver.ShortcutUrl.ToLower() != url.ToLower())
                {
                    continue;
                }

                // Redirect to the same shortcut URL to fix the connection security, normalize the base URL, normalize the shortcut URL casing, or any combination of
                // these.
                var canonicalAbsoluteUrl = GetDefaultBaseUrl(resolver.ConnectionSecurity.ShouldBeSecureGivenCurrentRequest(false)) +
                                           resolver.ShortcutUrl.PrependDelimiter("/");
                if (canonicalAbsoluteUrl != RequestState.Url)
                {
                    NetTools.Redirect(canonicalAbsoluteUrl);
                }

                if (ConfigurationStatics.IsIntermediateInstallation && !RequestState.IntermediateUserExists)
                {
                    throw new AccessDeniedException(true, null);
                }

                var resource = resolver.Function();
                if (resource == null)
                {
                    throw new AccessDeniedException(false, resolver.LogInPageGetter?.Invoke());
                }
                if (resource is ExternalResourceInfo)
                {
                    NetTools.Redirect(resource.GetUrl());
                }
                HttpContext.Current.RewritePath(getTransferPath(resource), false);
                break;
            }
        }
示例#2
0
        private void rewritePathIfShortcutUrl()
        {
            var ewfResolvers = new[]
            {
                new ShortcutUrlResolver(
                    "ewf",
                    ConnectionSecurity.SecureIfPossible,
                    () => {
                    var page = MetaLogicFactory.CreateBasicTestsPageInfo();
                    return(page.UserCanAccessResource ? page : null);
                }),
                new ShortcutUrlResolver(
                    "ewf/impersonate",
                    ConnectionSecurity.SecureIfPossible,
                    () => {
                    if (!UserManagementStatics.UserManagementEnabled)
                    {
                        return(null);
                    }
                    var page = MetaLogicFactory.CreateSelectUserPageInfo("");
                    return(page.UserCanAccessResource ? page : null);
                })
            };

            var url = GetRequestAppRelativeUrl(Request);

            foreach (var resolver in ewfResolvers.Concat(GetShortcutUrlResolvers()))
            {
                if (resolver.ShortcutUrl.ToLower() != url.ToLower())
                {
                    continue;
                }

                // Redirect to the same shortcut URL to fix the connection security, normalize the base URL, normalize the shortcut URL casing, or any combination of
                // these.
                var canonicalAbsoluteUrl = GetDefaultBaseUrl(resolver.ConnectionSecurity.ShouldBeSecureGivenCurrentRequest(false)) +
                                           resolver.ShortcutUrl.PrependDelimiter("/");
                if (canonicalAbsoluteUrl != RequestState.Url)
                {
                    NetTools.Redirect(canonicalAbsoluteUrl);
                }

                if (ConfigurationStatics.IsIntermediateInstallation && !RequestState.IntermediateUserExists)
                {
                    throw new AccessDeniedException(true, null);
                }

                var resource = resolver.Function();
                if (resource == null)
                {
                    throw new AccessDeniedException(false, resolver.LogInPageGetter?.Invoke());
                }
                if (resource is ExternalResourceInfo)
                {
                    NetTools.Redirect(resource.GetUrl());
                }
                HttpContext.Current.RewritePath(getTransferPath(resource), false);
                return;
            }

            // ACME challenge response; see https://tools.ietf.org/html/rfc8555#section-8.3
            var absoluteUrl = new Uri(RequestState.Url);

            if (absoluteUrl.Scheme == "http" && absoluteUrl.Port == 80 && absoluteUrl.AbsolutePath.StartsWith("/.well-known/acme-challenge/"))
            {
                var systemManager = ConfigurationStatics.MachineConfiguration?.SystemManager;
                if (systemManager != null)
                {
                    NetTools.Redirect(
                        systemManager.HttpBaseUrl.Replace("https://", "http://") +
                        "/Pages/Public/AcmeChallengeResponse.aspx?Token={0}".FormatWith(HttpUtility.UrlEncode(absoluteUrl.Segments.Last())));
                }
            }
        }