使用 FrontDoor 通过 Azure AD redirect_uri 进行身份验证不正确

oss*_*too 6 asp.net-core azure-container-instances azure-front-door

我有一个 Azure FrontDoor 设置作为在端口 5443 上运行的容器和自定义域之间的反向代理/负载均衡器。这样做的目的是为用户提供一个标准的地址。即https://oursite3.example.com指向container.azurecontainer.io:3443 。

同一个 aci 正在运行多个容器:


    container.azurecontainer.io:443
    container.azurecontainer.io:2443
    container.azurecontainer.io:3443

Run Code Online (Sandbox Code Playgroud)

    https://oursite1.example.com
    https://oursite2.example.com
    https://oursite3.example.com 
Run Code Online (Sandbox Code Playgroud)

(第 116 行:构建重定向Uri

然后,我们在全球不同区域部署了多个 aci(因此使用 Frontdoor 在不同实例之间进行负载平衡)。

在此示例中,container.azurecontainer.io:3443 安装了 MS AD 身份验证。单击链接后,用户会重定向到登录,并生成一个链接并将浏览器重定向到该链接。该链接中包含redirect_uri。类似于: https: //login.microsoftonline.com/00000000-0000-0000-0000-000000000001/oauth2/authorize ?client_id=00000000-0000-0000-0000-000000000002&redirect_uri=https%3A%2F%2Foursite3.example.com %3A3443%2Fsignin-oidc&response_type=id_token&scope=openid%20profile&response_mode=form_post&nonce=jkalksdfj alskdjflkjalksdfjalkjA&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0

但是,登录后,用户会在网站上看到以下内容:

AADSTS50011:请求中指定的回复 URL 与为应用程序配置的回复 URL 不匹配:“00000000-0000-0000-0000-000000000003”

原因是 AD 应用程序的回复 url 设置为:

https://oursite3.example.com/signin-oidc
Run Code Online (Sandbox Code Playgroud)

但是,仔细检查后,用户登录时重定向到的 url 包含此作为 redirect_uri:

https://oursite3.example.com:5443/signin-oidc
Run Code Online (Sandbox Code Playgroud)

即端口 5443 已添加到主机名的末尾。

本质上,它包括了redirect_uri 中的底层原始端口,这是我不希望看到的。

我尝试在我们的网站中使用 ForwardedOptions 。例如,我们的startup.cs文件包含以下内容(ConfigureServices):

            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
                                           ForwardedHeaders.XForwardedProto;
                // Only loopback proxies are allowed by default.
                // Clear that restriction because forwarders are enabled by explicit 
                // configuration.
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });
Run Code Online (Sandbox Code Playgroud)

接下来是(配置):

             app.UseForwardedHeaders();
Run Code Online (Sandbox Code Playgroud)

这并不能解决问题。

我查看了是否可以通过查看这里来覆盖设置为redirect_uri的值: https: //github.com/dotnet/aspnetcore/blob/b7e122fbac4207b003dc07f6101e50218be8ff21/src/Security/Authentication/Core/src/AuthenticationHandler 。CS

我也尝试过这个:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer ?view=aspnetcore-3.1#troubleshoot

和这个:

https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.1#nginx-configuration

有人知道还有什么可能是错的吗?

谢谢

Ro *_*Hit 8

当Web应用程序位于Azure Front Door后面时,我们需要将/authorize请求中的redirect_uri配置为Front Door的地址。

\n

在下面的代码中,我们重写“OnRedirectToIdentityProvider”事件并注入前门的地址。当我尝试这个时,我只是对地址进行了硬编码,但理想情况下,您可以从 Front Door 注入请求的标头中提取它。

\n

这是我在尝试对在 Azure 应用服务上运行、受 Azure AD 保护、在 Azure Front Door 后面运行的 Blazor 服务器应用程序 (.net 6) 进行身份验证时使用的代码。

\n
public void ConfigureServices(IServiceCollection services)\n{\n    // ... existing code\n\n    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)\n                .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))\n                .EnableTokenAcquisitionToCallDownstreamApi(new[] { "User.Read" })\n                .AddInMemoryTokenCaches();\n\n    services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>\n    {\n        options.Events = new OpenIdConnectEvents\n        {\n            OnRedirectToIdentityProvider = (context) =>\n            {   \n                // Override the redirect_uri\n                //  Ideally extract this from config \n                //  Or context.Request.Headers["X-Forwarded-Host"]\n                //  see: https://learn.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol#front-door-to-backend\n\n                context.ProtocolMessage.RedirectUri \n                    = "https://YOUR-FRONT-DOOR-or-APP-GATEWAY/signin-oidc";\n                return Task.FromResult(0);\n            }\n        };\n    });\n\n    services.Configure<ForwardedHeadersOptions>(options =>\n    {\n        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |\n                        ForwardedHeaders.XForwardedProto;\n        options.KnownNetworks.Clear();\n        options.KnownProxies.Clear();\n    });\n\n    // ... existing code\n}\n\npublic void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n{\n    // ... existing code\n    \n    // Don\'t forget to add this ...\n    app.UseForwardedHeaders();\n    \n    // ... existing code\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当代码运行时,“redirect_uri”参数应指向您的前门/网关,如下所示。

\n

在此输入图像描述

\n

希望有帮助。\xe2\x9d\xa4\xef\xb8\x8f

\n