Single sign on Azure AD使用应用程序网关和ASE重定向URL

Single sign on Azure AD使用应用程序网关和ASE重定向URL,single-sign-on,azure-active-directory,http-status-code-302,azure-app-service-envrmnt,azure-application-gateway,Single Sign On,Azure Active Directory,Http Status Code 302,Azure App Service Envrmnt,Azure Application Gateway,我们有一个ASP Core 2.0应用程序,可以在公共网络上与Azure广告配合使用。我们的测试环境正在Azure ASE中运行。用户从通过Azure应用程序网关的公共地址开始,并路由到ASE中2个应用程序服务器中的1个。应用程序在Azure AD中注册,响应URL指定公共地址 问题是,当用户重定向到登录时,提交给Azure AD的请求地址是来自两台服务器之一的内部地址。然后响应URL不匹配,我们在登录时出错 问题是如何向Azure AD显示公共地址,以便使用相同的URL将响应URL的匹配项和令

我们有一个ASP Core 2.0应用程序,可以在公共网络上与Azure广告配合使用。我们的测试环境正在Azure ASE中运行。用户从通过Azure应用程序网关的公共地址开始,并路由到ASE中2个应用程序服务器中的1个。应用程序在Azure AD中注册,响应URL指定公共地址

问题是,当用户重定向到登录时,提交给Azure AD的请求地址是来自两台服务器之一的内部地址。然后响应URL不匹配,我们在登录时出错

问题是如何向Azure AD显示公共地址,以便使用相同的URL将响应URL的匹配项和令牌发布回应用程序?据我所知,应用网关配置为填充x-forwarded-for标头,该标头具有原始地址。我看不出在web应用程序中这在哪里可以控制。 startup.cs

        services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
         .AddAzureAd(options =>
         {
             Configuration.Bind("AzureAd", options);
             AzureAdOptions.Settings = options;
         })
         .AddCookie();
            app.Use((ctx, next) =>
            {
                ctx.Request.Host = new HostString(options.Value.CustomDomain;
                ctx.Request.Scheme = "https";
                return next();
            });
AccountController.cs

    public IActionResult SignIn()
    {
        var redirectUrl = _azureAdOptions.WebBaseUrl;
        return Challenge(
            new AuthenticationProperties { RedirectUri = redirectUrl },
            OpenIdConnectDefaults.AuthenticationScheme);
    }
我认为这是一种常见的配置—通过集成SSO将公共服务器传递给私有服务器

[编辑]

基于评论中提供的链接(这非常有用),我们尝试了几件事,包括在startup.cs中显式设置UseforwardedHeaders,尽管这在默认情况下应该是启用的。我们所做的一切都没有改变下面URL中粗体显示的URL

https://login.microsoftonline.com/2ff13e34-f33f-498b-982a-7cb336e12bc6/oauth2/authorize?client_id=998c48ae-bbcf-4724-b6f4-6517e41d180a&redirect_uri=**http%3A%2F%2Flocalhost%3A2345%2Fsignin-oidc**&resource=https%3A%2F%2Fgraph.windows.net&response_type=id_token%20code&scope=openid%20profile&response_mode=form_post......
然而,这可能是一个线索,如果我们在家庭控制器上注释掉[Authorize],并在用户单击按钮登录后登录,它就会工作。为什么?

注意:上面的id/guid已经被置乱,以保护我在解释applicationgateway如何没有实现标准的x-forwarded-host报头时遇到的无辜者。我希望这个问题得到解决,这样就不需要下面的代码了。在我们的配置中起作用的解决方案是在每个请求上强制使用公共域和方案(HTTPS),因为应用网关没有(显然无法)配置为将SSL传递到后端服务器

添加到startup.cs

        services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
         .AddAzureAd(options =>
         {
             Configuration.Bind("AzureAd", options);
             AzureAdOptions.Settings = options;
         })
         .AddCookie();
            app.Use((ctx, next) =>
            {
                ctx.Request.Host = new HostString(options.Value.CustomDomain;
                ctx.Request.Scheme = "https";
                return next();
            });

现在,当应用程序重定向任何安全资源--[Authorize]控制器方法或显式调用质询(x、y、z)的代码时,HTTPS上的公共域将用作源主机和方案。感谢@juunas指出了正确的方向。

也许这会有所帮助:@juunas该文档很有帮助,谢谢,但没有帮助解决问题。我根据调查结果更新了帖子。