You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC认证令牌未按配置过期,无法触发重新认证求助

问题排查:ASP.NET MVC OIDC认证Cookie过期未生效

核心问题拆解

你配置了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:06:16