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

ASP.NET Core Identity 闲置数分钟后自动登出问题排查

问题根因

本地运行正常、发布到共享托管环境后闲置数分钟自动登出,核心原因基本都是ASP.NET Core Data Protection 密钥未做持久化配置,少数情况是Cookie配置缺失、托管环境IIS默认配置导致:

  • 本地IIS/开发环境运行时,Data Protection默认将认证Cookie的加密密钥存储在当前用户的本地配置目录中,应用重启后密钥不丢失,配置的30天Cookie有效期可以正常生效
  • 共享托管环境下,站点通常运行在低权限用户上下文,默认没有可持久化存储密钥的路径,密钥会直接存在应用进程内存中。一旦应用池闲置回收、进程重启、站点自动切换节点,内存中的密钥就会被清空,之前下发的所有认证Cookie无法被解密,系统会直接判定用户未登录,跳转回登录页
  • 绝大多数托管商的IIS应用池默认空闲超时为5~20分钟,刚好匹配“闲置数分钟自动登出”的现象。
修复方案

1. 配置Data Protection密钥持久化

这一步是必做项,将密钥存储在站点自身的可写目录下,不受进程重启、应用池回收影响。将以下代码加到Program.cs中,位置要放在认证、Identity相关服务注册之前:

// 需提前引入命名空间:using Microsoft.AspNetCore.DataProtection;
builder.Services.AddDataProtection()
    // 密钥存在站点根目录下的data-protection-keys文件夹
    .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(builder.Environment.ContentRootPath, "data-protection-keys")))
    // 固定应用名,避免同服务器下多站点密钥冲突
    .SetApplicationName("替换为你的站点唯一标识,比如MyBlogSite");

部署后需要给data-protection-keys文件夹开放IIS运行账户(通常为IIS_IUSRS用户组)的读写权限,否则密钥写入失败会回退到内存存储模式,问题依旧存在。

2. 补全Cookie认证的缺失配置

当前的Cookie配置缺少几个关键项,修改后完整配置如下:

builder.Services.ConfigureApplicationCookie(options =>
{
    options.AccessDeniedPath = "/503";
    options.ExpireTimeSpan = TimeSpan.FromDays(30);
    options.LoginPath = "/Index";
    // 新增以下配置
    options.SlidingExpiration = true; // 开启滑动过期,用户每次访问自动续期Cookie有效期
    options.Cookie.HttpOnly = true; // 禁止前端JS读取Cookie,降低XSS窃取风险
    options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; // 适配托管环境HTTPS反代,避免HTTPS站点下Cookie被拦截
    options.Cookie.SameSite = SameSiteMode.Lax; // 兼容主流浏览器SameSite策略,避免Cookie被浏览器拒收
    options.Cookie.IsEssential = true; // 标记认证Cookie为必要Cookie,避免GDPR中间件默认清除非必要Cookie导致登出
});

注意:当前代码里的AddAuthentication写法不完整,如果没有调用AddIdentity/AddDefaultIdentity方法自动注册认证方案,需要补全Cookie认证的注册逻辑:

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(); // 认证相关配置已经通过ConfigureApplicationCookie统一设置,这里不用重复写

3. 托管环境IIS配置适配

如果你有托管商的IIS管理权限,可以同步调整应用池配置优化体验:

  • 将应用池**空闲超时(Idle Time-out)**设置为0,或者和你的Cookie有效期对齐(比如30天=43200分钟),避免闲置时自动回收进程
  • 将应用池**固定回收间隔(Regular Time Interval)**设置为0,或者配置在凌晨低峰期定时回收,避免默认29小时随机回收影响用户体验
    如果没有IIS配置权限也没关系,只要完成第一步的Data Protection密钥持久化,就算应用池回收,重启后站点依然可以读取到历史密钥解密原有Cookie,不会触发自动登出。

4. 负载均衡场景额外处理

如果托管商用了多节点负载均衡,要么开启粘性会话保证同一用户的请求始终转发到同一个节点,要么将Data Protection密钥存储在所有节点都能访问的共享位置(比如共享目录、分布式缓存),保证所有节点用同一套密钥加解密Cookie。

验证方式

配置发布后,登录站点等待超过之前触发自动登出的闲置时长再访问,或者手动在托管面板回收一次应用池后刷新页面,如果不需要重新登录就说明配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:48:51