Net Core 6 Razor MVC中Authorize属性忽略认证Cookie过期问题排查
你的问题核心在于OpenID Connect (OIDC) 默认会使用 id_token 的过期时间来覆盖 Cookie 的过期设置,导致你配置的8分钟Cookie过期规则没有生效。具体来说,ASP.NET Core的认证系统判断用户是否已认证,主要依据的是AuthenticationTicket的过期时间,而这个时间默认是从OIDC返回的id_token中的exp声明获取的,通常这个token的有效期会比你设置的8分钟长很多。
下面是具体的修复步骤:
1. 禁用OIDC的Token生命周期覆盖
在AddOpenIdConnect配置中,将UseTokenLifetime设置为false,这样系统就不会用OIDC token的有效期来覆盖Cookie的过期规则:
.AddOpenIdConnect(options => { // 其他现有配置... options.UseTokenLifetime = false; // 关键设置:禁用token生命周期覆盖 })
2. 手动同步AuthenticationTicket的过期时间与Cookie设置
即使禁用了UseTokenLifetime,最好还是在OIDC的OnTokenValidated事件中,手动设置AuthenticationTicket的过期时间,确保和你的Cookie过期时间完全一致:
.AddOpenIdConnect(options => { // 其他现有配置... options.UseTokenLifetime = false; options.Events = new OpenIdConnectEvents { OnTokenValidated = context => { // 设置Ticket的过期时间为当前时间+8分钟,和Cookie保持一致 context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(8); return Task.CompletedTask; } }; })
3. 验证Cookie配置的正确性
你当前的Cookie配置是正确的,但再确认一下关键点:
SlidingExpiration = false:关闭滑动过期,确保用户无活动8分钟后Cookie立即失效,符合你的需求。ExpireTimeSpan和Cookie.MaxAge都设置为8分钟,两者保持一致,避免冲突。
为什么之前的配置不生效?
当用户通过OIDC登录成功后,ASP.NET Core会创建一个AuthenticationTicket,这个Ticket的过期时间默认取自OIDC提供商返回的id_token的exp字段(通常是1小时或更久)。即使你的Cookie过期了,只要Ticket还在有效期内,系统依然会认为用户处于已认证状态,所以能正常访问[Authorize]标记的Action。
通过上面的配置,我们强制让Ticket的过期时间和Cookie保持同步,这样就能确保8分钟无活动后,用户的认证状态失效,访问Test页面时会被重定向到登录页。
内容的提问来源于stack exchange,提问作者ktary




