IdentityServer4部署Azure后登录重定向循环,本地及手动访问均正常
基础信息
Localhost本地环境运行完全正常- 项目部署到Azure开发环境后出现故障
- 使用IdentityServer4
- 使用EntityFramework
故障复现步骤
- 访问应用内需要登录权限的端点(Home/Claim)
- 系统正确跳转至登录页面
- 输入用户名密码后,正确携带set cookie响应头跳转回应用的OIDC端点
- 随后跳转回最初的Home/Claim端点时,请求中未携带对应cookie
- 系统再次跳转回登录页,检测到用户已登录后又返回应用OIDC端点,进入重定向循环
奇怪的是,如果停止浏览器加载,手动导航回应用的Home/Claim端点,功能完全正常!请求头中正确携带c1和c2 cookie,用户身份验证成功,不会跳转回登录页。
相关链路与请求头说明
重定向链路如下(Claim为目标访问端点):
带client_id的callback接口属于登录服务域名,signin-oidc和Claim接口属于应用域名
首次跳转回Home/Claim端点时的请求头如下:值得注意的是,本地环境下跳转至Home/Claim时会正常设置第二张图中的cookie,首次跳转即可生效,而开发环境下不会设置。
完成上述步骤后手动访问Home/Claim端点的请求头如下,可见请求中已携带cookie:
补充说明
- 已排查日志,未发现任何报错,也没有身份验证失败的警告或错误信息
- 两端配置均已核验,刷新页面后功能可正常使用,大概率不是严重配置错误
解决方法
该问题已通过下述方案解决:将下列代码添加到所有需要接入Identity Server的客户端项目的startup.cs文件中即可。
app.Use(async (ctx, next) => { if (ctx.Request.Path == "/signout-oidc" && !ctx.Request.Query["skip"].Any()) { var location = ctx.Request.Path + ctx.Request.QueryString + "&skip=1"; ctx.Response.StatusCode = 200; var html = $@" <html> <head> <meta http-equiv='refresh' content='0;url={location}' /> </head> </html>"; await ctx.Response.WriteAsync(html); return; } await next(); if (ctx.Request.Path == "/signin-oidc" && ctx.Response.StatusCode == 302) { var location = ctx.Response.Headers["location"]; ctx.Response.StatusCode = 200; var html = $@" <html> <head> <meta http-equiv='refresh' content='0;url={location}' /> </head> </html>"; await ctx.Response.WriteAsync(html); } });
内容的提问来源于stack exchange,提问作者Jeff B
相关产品推荐
相关产品推荐

