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

ASP.NET Core MVC中Cookie的ExpireTimeSpan设置失效,为何固定30分钟超时?

ASP.NET Core MVC Cookie认证30分钟自动登出问题排查与解决

哥们,你遇到的这个问题我之前踩过坑,大概率是滑动过期没配置到位,再加上ASP.NET Core默认的一些限制在搞鬼,甚至IIS的设置也可能插一脚,咱们一步步捋清楚:

核心原因拆解

你设置了ExpireTimeSpan但每次30分钟必登出,哪怕一直在刷新,主要有这几个可能:

  1. 没开启滑动过期(Sliding Expiration):Cookie的过期时间是登录时固定死的,不会随用户活动刷新;
  2. ASP.NET Core Identity的安全戳验证间隔默认是30分钟,到点会强制验证用户身份,没配置的话可能直接登出;
  3. IIS应用程序池的空闲超时设置(不过你每10秒刷新的话这个概率低,但也得排查);
  4. 项目里用了Session,Session默认30分钟超时导致连锁反应。

具体解决步骤

1. 确保Cookie认证开启滑动过期

这是最常见的问题!不管你是用纯Cookie认证还是ASP.NET Core Identity,都得开启滑动过期,让用户每次活动时自动刷新Cookie的过期时间。

纯Cookie认证场景(Startup.cs/.NET 6+的Program.cs)

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromHours(1); // 你想要的过期时长
        options.SlidingExpiration = true; // 关键!开启滑动过期
        options.LoginPath = "/Account/Login";
        options.LogoutPath = "/Account/Logout";
    });

ASP.NET Core Identity场景

如果你用了Identity,不能直接用AddCookie,得通过ConfigureApplicationCookie来配置:

// 先注册Identity
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

// 再配置Identity的Cookie选项
services.ConfigureApplicationCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromHours(1);
    options.SlidingExpiration = true; // 必须开启!
    options.LoginPath = "/Identity/Account/Login";
    options.LogoutPath = "/Identity/Account/Logout";
});

2. 调整Identity的安全戳验证间隔(如果用了Identity)

ASP.NET Core Identity默认每隔30分钟会验证一次用户的安全戳(比如密码是否修改),这个ValidationInterval默认是30分钟,哪怕你设置了更长的Cookie过期时间,到点也可能触发登出。你可以把这个间隔延长,或者自定义刷新逻辑:

services.Configure<SecurityStampValidatorOptions>(options =>
{
    // 把验证间隔改成和Cookie过期时间一致,比如1小时
    options.ValidationInterval = TimeSpan.FromHours(1);
    
    // 或者开启滑动式验证,每次请求都更新验证时间(可选)
    options.OnRefreshingPrincipal = context =>
    {
        context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1);
        return Task.CompletedTask;
    };
});

3. 排查IIS应用程序池设置

虽然你每10秒刷新不会触发空闲超时,但还是检查一下:

  • 打开IIS管理器,找到你的应用程序池,右键选择「高级设置」;
  • 找到「空闲超时(分钟)」,默认是20分钟,如果你之前改成了30,那就把它调到比你的ExpireTimeSpan更长,或者临时设为0(永不超时,生产环境不建议)。

4. 检查Session超时(如果项目用了Session)

如果你的代码依赖Session来判断登录状态,Session默认30分钟超时会导致登出。调整Session配置:

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(1); // 延长Session超时
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

注意中间件顺序:app.UseSession()要放在app.UseRouting()之后,app.UseAuthorization()之前。

验证方法

配置完后,登录网站,打开浏览器开发者工具(F12),查看Cookie的过期时间,每刷新一次页面,Cookie的过期时间应该会往后顺延,这样就不会再出现30分钟强制登出的问题了。

内容的提问来源于stack exchange,提问作者Hogan.Wong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:37:29