Chrome/Edge未携带IdentityServer4的idsrv认证Cookie导致认证失败求助
兄弟我之前踩过类似的Cookie坑!先把你的问题再理清楚,然后给几个实际可行的排查和解决方向:
我正在调试一个基于IdentityServer4的遗留ASP.NET Core认证系统,发现Chrome和Edge浏览器存在Cookie处理问题:
当登录页面通过HTTPS提交用户凭证后,Login接口返回302重定向到同一服务器的/connect/authorize/callback地址,同时返回3个Cookie:
.AspNetCore.Identity.Application:path=/; secure; samesite=lax; httponlyidsrv.session:path=/; secure; samesite=noneidsrv:expires= Tue, 30 Apr 2024 14:29:35 GMT; path=/; secure; samesite=none; httponly用Firefox时,浏览器请求回调地址会带上所有3个Cookie,认证正常;但Chrome/Edge请求回调地址时只带前两个,不带
idsrvCookie,导致认证失败。
可能的原因&解决办法
SameSite=None的Cookie校验细节
Chrome对SameSite=None的Cookie要求特别严格,虽然你已经加了Secure属性,但有没有可能响应头里的Cookie格式有问题?比如多余空格、属性顺序异常?试试调整下idsrvCookie的属性顺序,把Secure放在SameSite=None前面(虽然规范不要求顺序,但老版本Chrome确实有兼容问题)。Cookie过期时间的时间同步问题
你看idsrv的过期时间是Tue, 30 Apr 2024 14:29:35 GMT,会不会用户浏览器的本地时间比这个时间晚?Chrome会直接丢弃已过期的Cookie,自然不会携带。可以检查下服务器时间和用户本地时间是否同步,或者临时把过期时间设得远一点测试。域名上下文的判定问题
虽然是同一服务器,但有没有可能登录页面和回调地址的域名在Chrome里被判定为不同上下文?比如登录是www.example.com,回调是example.com,或者用了子域名?试试给idsrvCookie加上明确的Domain属性(比如domain=example.com;),强制浏览器识别为同域Cookie。IdentityServer4的Cookie配置检查
去项目的ConfigureServices里看看IdentityServer的Cookie配置,是不是没把正确的规则应用到idsrvCookie上?比如可以明确指定:services.AddIdentityServer() .AddCookieAuthentication(options => { options.Cookie.Name = "idsrv"; options.Cookie.SameSite = SameSiteMode.None; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.HttpOnly = true; options.Cookie.Expiration = TimeSpan.FromHours(1); // 临时设长点测试 }) // 其他IdentityServer配置...确保这些配置覆盖了默认的Cookie设置。
Chrome隐私设置的影响
让用户检查下Chrome的隐私设置,是不是开启了「阻止第三方Cookie」?哪怕是同一服务器,Chrome的隐私增强模式有时候会误判这类Cookie。可以让用户临时关闭该设置测试,如果恢复正常,就需要调整Cookie配置来适配Chrome的隐私策略。
备注:内容来源于stack exchange,提问作者mikeagg

