将应用与身份服务器App Service迁移至Azure Front Door后出现无限重定向
解决Azure Front Door配置后App与Duende Identity Server的无限重定向问题
以下是针对该无限重定向循环问题的排查和解决步骤:
1. 配置App Service的转发头识别
Azure Front Door会向后端App Service发送X-Forwarded-For、X-Forwarded-Proto等头信息,应用必须正确识别这些头才能获取真实的请求协议和域名,否则Cookie的Secure属性、域设置会出错,导致登录状态无法保持。
- 在Azure Portal的App Service资源中,进入「配置」>「常规设置」,将「Forwarded Headers」设置为「On」。
- 若为ASP.NET Core应用,在
Program.cs中添加转发头中间件(需放在认证中间件之前):app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
2. 修正Cookie的Domain和SameSite属性
由于app.mydomain.com和auth.mydomain.com属于同一主域mydomain.com,需确保登录相关Cookie的域设置正确,适配跨域场景:
- 在BFF配置中,将Cookie的Domain设为
.mydomain.com(前缀点确保子域均可访问):builder.Services.AddBff(options => { options.Cookies.SessionCookie.Domain = ".mydomain.com"; options.Cookies.AntiforgeryCookie.Domain = ".mydomain.com"; }); - 开启Cookie的Secure属性(适配Front Door的HTTPS环境),并设置合适的SameSite值:
builder.Services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.Lax; options.Secure = CookieSecurePolicy.Always; });
3. 验证Duende Identity Server的回调地址配置
确保Identity Server中客户端的回调地址指向Front Door端点,而非App Service原始地址:
- 在Identity Server的客户端配置里,更新
RedirectUris和PostLogoutRedirectUris:new Client { ClientId = "app-client", // 其他配置... RedirectUris = { "https://app.mydomain.com/signin-oidc" }, PostLogoutRedirectUris = { "https://app.mydomain.com/signout-callback-oidc" }, FrontChannelLogoutUri = "https://app.mydomain.com/bff/logout" }
4. 检查Front Door的路由与缓存设置
- 禁止缓存登录相关路径(如
/bff/*、/signin-oidc、/connect/authorize):进入Front Door「路由规则」,将对应路由的「缓存行为」设为「不缓存」,或添加缓存排除路径。 - 确保Front Door传递
Cookie、Authorization等关键请求头,路由规则的「转发协议」选择「HTTPS only」,并启用传递客户端头选项。
5. 确认BFF的OIDC回调处理逻辑
检查BFF的OIDC配置,确保回调路径和身份提供者地址正确,且转发头配置生效:
builder.Services.AddAuthentication(options => { options.DefaultScheme = "cookie"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("cookie", options => { options.Cookie.Domain = ".mydomain.com"; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Lax; }) .AddOpenIdConnect("oidc", options => { options.Authority = "https://auth.mydomain.com"; options.ClientId = "app-client"; options.ClientSecret = "your-client-secret"; options.ResponseType = "code"; options.Scope = new List<string> { "openid", "profile" }; options.SaveTokens = true; options.CallbackPath = "/signin-oidc"; options.SignedOutCallbackPath = "/signout-callback-oidc"; // 强制回调地址指向Front Door端点 options.Events.OnRedirectToIdentityProvider = context => { context.ProtocolMessage.RedirectUri = "https://app.mydomain.com/signin-oidc"; return Task.CompletedTask; }; });
内容的提问来源于stack exchange,提问作者user1368182
相关产品推荐
相关产品推荐

