You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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立即失效,符合你的需求。
  • ExpireTimeSpanCookie.MaxAge都设置为8分钟,两者保持一致,避免冲突。

为什么之前的配置不生效?

当用户通过OIDC登录成功后,ASP.NET Core会创建一个AuthenticationTicket,这个Ticket的过期时间默认取自OIDC提供商返回的id_token的exp字段(通常是1小时或更久)。即使你的Cookie过期了,只要Ticket还在有效期内,系统依然会认为用户处于已认证状态,所以能正常访问[Authorize]标记的Action。

通过上面的配置,我们强制让Ticket的过期时间和Cookie保持同步,这样就能确保8分钟无活动后,用户的认证状态失效,访问Test页面时会被重定向到登录页。

内容的提问来源于stack exchange,提问作者ktary

火山引擎 最新活动