ASP.NET Core Web应用Docker镜像远程登录关联失败求助
解决ASP.NET Core Docker镜像Azure AD登录关联失败问题
问题描述
本地测试ASP.NET Core Web应用Docker镜像时,执行docker run命令出现以下错误:
warn: Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler[15] '.AspNetCore.Correlation.AzureADOpenID.qCkwXxlpGF5ynTfvNW2Igg90nqvtstBG9eqgOeGn7Os' cookie not found. fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1] An unhandled exception has occurred while executing the request. System.Exception: An error was encountered while handling the remote login. ---> System.Exception: Correlation failed. --- End of inner exception stack trace --- at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync() at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
应用Azure AD配置片段:
{ "Instance": "https://login.microsoftonline.com/", "Domain": "xxxxx", "TenantId": "xxxxx", "ClientId": "xxxxx", "CallbackPath": "/signin-oidc", "ClientSecret": "xxxxx" }
Docker运行命令:
docker run --env-file envFileWeb.txt -v c:/temp/aa/:/app/aa -it --rm -p 8543:8080 --name aspnetcore_sample xxxxx.azurecr.io/xxxx:latest
通过Visual Studio调试Docker时,日志仍显示该错误,但页面未重定向到signin-oidc且能正常访问;注释CallbackPath配置后,站点仍重定向到该路径并报错。
解决方案
1. 对齐Docker端口映射与HTTPS配置
当前Docker命令将本地8543端口映射到容器内8080端口(HTTP),但登录流程依赖HTTPS,需调整为HTTPS端口映射:
- 修改
docker run命令,映射HTTPS端口并配置证书:docker run --env-file envFileWeb.txt -v c:/temp/aa/:/app/aa -v ${USERPROFILE}\.aspnet\https:/https/ -e ASPNETCORE_URLS="https://+:443;http://+:8080" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/YourAppCert.pfx -e ASPNETCORE_Kestrel__Certificates__Default__Password="your-cert-password" -it --rm -p 8543:443 -p 8080:8080 --name aspnetcore_sample xxxxx.azurecr.io/xxxx:latest - 确保Azure AD应用注册中的重定向URI设置为
https://localhost:8543/signin-oidc,与本地访问地址完全一致。
2. 调整Cookie安全配置
关联Cookie丢失通常与SameSite或Secure属性配置不当有关,在ConfigureServices中添加Cookie配置:
services.Configure<CookieAuthenticationOptions>(AzureADDefaults.CookieScheme, options => { // 跨域场景下需设置为None,配合HTTPS使用 options.Cookie.SameSite = SameSiteMode.None; // 强制Cookie仅通过HTTPS传输 options.Cookie.SecurePolicy = CookieSecurePolicy.Always; });
3. 统一回调路径配置
/signin-oidc是Azure AD认证的默认回调路径,无需注释,只需确保:
- 应用配置中的
CallbackPath与Azure AD重定向URI的路径部分一致; - 在
OnAuthorizationCodeReceived方法中,显式指定正确的回调URI,避免自动获取的地址不匹配:private async static Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext ctx) { // ... 原有代码 // 替换为实际的HTTPS回调地址 var redirectUri = "https://localhost:8543/signin-oidc"; var result = await authContext.AcquireTokenByAuthorizationCodeAsync( ctx.ProtocolMessage.Code, new Uri(redirectUri), credential, resource: AZUREADGRAPH_RESOURCE); // ... 原有代码 }
4. 验证Redis缓存的正确性
确保Redis连接字符串配置正确,且Token缓存未干扰关联Cookie的生成:
- 检查
CacheConnection环境变量是否在envFileWeb.txt中正确设置; - 确认Redis服务正常运行,容器可访问该Redis实例。
5. 确认请求管道顺序
确保认证中间件的顺序正确,当前Configure方法中顺序已正确,但需确认UseHttpsRedirection在UseAuthentication之前,确保所有请求先跳转至HTTPS:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... 原有代码 app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // ... 原有代码 }
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

