ASP.NET Core OIDC多代理环境下认证失败问题咨询
本人刚接触MSAL与OIDC,若表述有误敬请谅解。
我运行着一个供员工访问的ASP.NET Core 6.0应用,该应用通常部署在本地客户端服务器,可能会根据客户网络环境处于一个或多个负载均衡器/代理之后。员工页面通过OIDC发起认证挑战,将用户重定向至Microsoft登录页,登录完成后跳转回认证回调URL以访问页面。单代理环境下正常,但多代理时出现认证失败问题。
测试环境与当前配置
测试环境中,我使用Azure API Management Services与ngrok配合,将请求转发至本地运行的应用。已在Startup.cs中配置ForwardedHeaderMiddleware:
// In ConfigureServices() services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.All; options.ForwardLimit = null; options.RequireHeaderSymmetry = false; }); // In Configure() app.UseForwardedHeaders(); app.UseAuthentication(); app.UseAuthorization();
首次出现的问题:Correlation Failed错误
此配置下,通过API Management访问页面(如https://myorg.azure-api.net/myApiPath/myPage)时,重定向回应用后出现“Correlation Failed”错误。原因是请求的host为myorg.azure-api.net、path为/myPage,Nonce与Correlation Cookie的Domain和Path被设为对应值,而重定向请求路径为/myApiPath/signin-oidc,Cookie因路径不匹配被过滤。
尝试临时修复后的新问题:AADSTS500112错误
尝试将上述Cookie的Path手动设为/:
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options => { options.NonceCookie.Path = options.CorrelationCookie.Path = "/"; });
此操作解决了Cookie过滤问题,但出现新错误:
AADSTS500112: The reply address 'https://123456789.ngrok.io/signin-oidc' does not match the reply address 'https://myorg.azure-api.net/myApiPath/signin-oidc' provided when requesting Authorization code.
这表明ASP.NET Core期望重定向请求的Host与初始挑战时提供的重定向URI的Host匹配,多代理环境下不知如何实现。修改SameSite策略导致Chrome再次过滤Cookie。
疑问
- 我哪里配置错误?是否遗漏了让请求正常传递的配置?
- 是否复杂化了配置?多代理场景应存在更优方案,手动设置Cookie Path为
/更像临时 workaround,寻求正确解决方法。
内容的提问来源于stack exchange,提问作者draconastar

