Azure AD登录重定向中断问题求助(ASP.NET Core+Cloudflare代理)
环境与代码配置
ASP.NET Core应用托管在Azure App Service,通过Cloudflare代理。已配置ASP.NET Core Identity Cookie,额外添加以下认证扩展方法:
internal static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder authenticationBuilder, IConfiguration config) { void configureMicrosoftIdentityOptions(OpenIdConnectOptions options) { options.Authority = config["xxx:Authority"]; options.ClientId = config["xxx:ClientId"]; options.ClientSecret = config["xxx:ClientSecret"]; options.SignInScheme = IdentityConstants.ApplicationScheme; options.ResponseType = OpenIdConnectResponseType.IdToken; options.Prompt = "select_account"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidAudience = config["xxx:ClientId"], }; }; return authenticationBuilder.AddOpenIdConnect("AzureAD", configureMicrosoftIdentityOptions); } public static AuthenticationBuilder AddCookieLogin(this AuthenticationBuilder authenticationBuilder) { void configureCookieAuthOptions(CookieAuthenticationOptions options) { options.Cookie.Name = "MyApp"; options.Cookie.IsEssential = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.ExpireTimeSpan = TimeSpan.FromDays(1); options.SlidingExpiration = true; options.LoginPath = "/signin"; } return authenticationBuilder.AddCookie(configureCookieAuthOptions); }
认证流程通过控制器动作触发:return Challenge(new AuthenticationProperties { RedirectUri = "/" }, scheme);
Azure AD应用注册配置正常,重定向URI设置为{MYURIHERE}/signin-oidc。
问题现象
本地测试完全正常,日志显示Azure AD回调后用户已登录,从signin-oidc端点跳转至指定重定向URI。但启用Cloudflare代理后,偶尔出现登录Azure AD后浏览器卡住直至超时的情况,此时浏览器地址为:https://login.microsoftonline.com/common/reprocess?ctx=xxx0&sessionid=yyy
应用日志仍记录“AuthenticationScheme: xxx signed in.”,且仅记录到Request finished HTTP/1.1 POST XXX/signin-oidc - 302 0 - 1014.6661ms后便无后续日志。提前按CTRL+F5清理缓存可临时解决问题,尝试调整Cookie配置、在登录页加载前设置Clear-Site-Data header均无效。
2023-10-16更新
将AddOpenIdConnect替换为AddMicrosoftAccount后问题依旧,浏览器卡在https://login.microsoftonline.com/common/oauth2/v2.0/authorize页面,Edge浏览器左下角提示“waiting for MYREDIRECTURIDOMAIN.com”。另一套同样通过Cloudflare代理的ASP.NET Core应用使用Azure内置认证方法无此问题,判断问题出在自定义认证代码中。
排查与解决建议
- 排除认证端点的Cloudflare缓存:确保
/signin-oidc、/signin等认证相关端点被添加到Cloudflare的缓存排除规则中,避免代理缓存认证响应或Cookie。 - 配置Cookie的SameSite属性:当前代码未设置SameSite属性,在代理跨域场景下可能导致Cookie无法正确传递。建议添加:
若需跨域传递Cookie,可设置为options.Cookie.SameSite = SameSiteMode.Lax;SameSiteMode.None(需确保SecurePolicy保持CookieSecurePolicy.Always)。 - 启用转发头部处理:由于应用通过Cloudflare代理,需正确识别原始请求的协议和主机。在Program.cs中添加:
同时在Azure App Service的配置中启用“Forwarded Headers”选项,确保Cloudflare传递的app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });X-Forwarded-Proto等头部被应用正确识别。 - 显式指定OpenIdConnect回调路径:在
AddAzureAd的配置中显式设置CallbackPath,避免自动生成路径出现不一致:options.CallbackPath = "/signin-oidc"; - 检查Cloudflare WAF规则:查看Cloudflare防火墙日志,确认是否有WAF规则拦截了认证回调的请求,如有则调整规则放行相关请求。
- 对照Azure内置认证配置:导出使用Azure内置认证的应用配置,对比其自动生成的认证代码(如Cookie设置、转发头部处理、OpenIdConnect参数等),补全自定义代码中缺失的关键配置。
内容的提问来源于stack exchange,提问作者hbulens

