Azure AD结合应用网关时ASP Core 2.0应用重定向问题咨询
针对你遇到的问题,核心原因是你的ASP.NET Core应用在Azure应用代理后面运行时,默认会使用内部服务器的主机名(intervalServer)生成OpenID Connect的回调URI,而非外部可访问的ourapp.msappproxy.net,导致登录后重定向到无法访问的内部地址。下面是具体的解决方案和对你疑问的解答:
一、核心修复步骤
1. 配置应用信任反向代理的转发头部
Azure应用代理会将外部请求的真实主机、协议等信息通过X-Forwarded-Host、X-Forwarded-Proto等HTTP头部转发给内部应用。你需要让ASP.NET Core识别这些头部,从而生成正确的外部回调URI。
在Startup.cs的ConfigureServices方法中添加转发头部配置:
services.Configure<ForwardedHeadersOptions>(options => { // 启用转发主机、协议和客户端IP options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; // 生产环境建议添加Azure应用代理的IP范围到已知代理列表,避免恶意头部攻击 // 可从Azure文档获取应用代理IP范围,这里示例添加单个IP options.KnownProxies.Add(IPAddress.Parse("应用代理的公网IP")); });
然后在Configure方法中,在UseAuthentication之前调用UseForwardedHeaders:
app.UseForwardedHeaders(); app.UseAuthentication(); app.UseMvc(); // 或你的其他业务中间件
2. 显式配置OpenID Connect的回调URL
你不需要修改CallbackPath(它始终是相对路径),而是要设置RedirectUri为完整的外部可访问URL,同时确保Azure AD应用注册中的回复URL包含这个地址。
在AddOpenIdConnect配置中补充:
services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(options => { options.ClientId = "你的Azure AD应用客户端ID"; options.Authority = "https://login.microsoftonline.com/你的租户ID/v2.0"; // 设置完整的外部回调URL options.RedirectUri = "https://ourapp.msappproxy.net/signin-oidc"; options.CallbackPath = "/signin-oidc"; // 保持相对路径不变 // 其他必要配置 options.SaveTokens = true; options.ResponseType = "code"; });
同时登录Azure门户,找到你的应用注册,在身份验证页面的重定向URI列表中添加https://ourapp.msappproxy.net/signin-oidc,确保类型选择Web。
二、对你疑问的解答
1. 若将重定向地址改为ourapp.msappproxy.net/signin-oidc,能否解决登录问题?
是的,这正是解决问题的核心方向,但要注意正确的配置方式:不是修改CallbackPath为绝对路径(它仅支持相对路径),而是通过设置RedirectUri为完整的外部URL,同时让应用信任代理转发的头部,这样Azure AD登录后会正确重定向到外部可访问的回调地址,而非内部的intervalServer/signin-oidc。
2. 是否需要额外登录步骤,或应修改应用使其接受AzureAppProxyUserSessionCookie或AzureAppProxyAccessCookie?
不需要额外的登录步骤,也不需要直接处理这些代理Cookie。Azure应用代理会自动处理这些Cookie的验证和转发,你的ASP.NET Core应用只需正常处理Azure AD的OpenID Connect登录流程即可。只要正确配置了转发头部和回调URL,应用代理会把经过验证的请求(或匿名请求)转发给内部应用,应用无需感知代理的存在。
内容的提问来源于stack exchange,提问作者Mikustykus

