ASP.NET MVC认证令牌未按配置过期,无法触发重新认证求助
核心问题拆解
你配置了Cookie的3分钟固定过期(SlidingExpiration=false),但用户登录后从未被要求重新认证,核心原因大概率是OIDC流程的自动令牌刷新机制覆盖了Cookie的过期设置,或是Cookie配置未完全生效。
具体排查与修复步骤
1. 拦截OIDC令牌验证事件,强制Cookie过期时间
当使用ResponseType = IdTokenToken并开启SaveTokens=true时,ASP.NET会自动用Refresh Token刷新Access Token,维持会话。需要在令牌验证事件中手动锁定Cookie过期时间:
.AddOpenIdConnect(options => { // 原有配置... options.Events.OnTokenValidated = context => { // 强制Cookie在登录后3分钟过期,覆盖自动刷新的默认行为 context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(3); // 标记为非持久化Cookie,避免浏览器持久存储 context.Properties.IsPersistent = false; return Task.CompletedTask; }; })
2. 补全Cookie认证的关键配置
当前Cookie配置缺少登录/登出路径,且未明确Cookie的安全属性,可能导致过期逻辑未正确触发:
.AddCookie(opt => { opt.Cookie.Name = "TestAuthCookie"; opt.ExpireTimeSpan = TimeSpan.FromMinutes(3); opt.SlidingExpiration = false; opt.LoginPath = "/Account/Login"; // 确保认证跳转路径正确 opt.LogoutPath = "/Account/Logout"; opt.Cookie.HttpOnly = true; // 防止XSS窃取Cookie opt.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境必须启用HTTPS opt.Cookie.SameSite = SameSiteMode.Lax; })
3. 同步Keycloak端的令牌生命周期
从你提供的Keycloak Access Token设置截图来看:
- 确保Access Token Lifespan设置为3分钟,与Cookie过期时间一致
- 缩短Refresh Token Lifespan(建议不超过3分钟),或在客户端禁用Refresh Token的自动使用,避免绕过Cookie过期逻辑
4. 验证浏览器Cookie的实际过期时间
打开浏览器开发者工具→Application→Cookies,查看TestAuthCookie的Expires/Max-Age值,确认是否为登录时间+3分钟。如果显示的过期时间远长于预期,说明配置被OIDC事件或其他代码覆盖。
5. 排查是否有其他代码修改Cookie属性
检查应用中的全局过滤器、自定义认证中间件或Action过滤器,确保没有代码在后续流程中修改Cookie的过期时间或持久化属性。
内容的提问来源于stack exchange,提问作者Cyber
相关产品推荐
相关产品推荐

