ASP.NET Core Identity能否通过Cookie实现IIS进程回收后自动重登
问题解决方案
核心原因
你遇到的IIS应用池回收后用户全员登出的问题,和Cookie有效性、会话配置无关,根源是ASP.NET Core默认的Data Protection密钥为进程内存储,应用池重启/回收后密钥丢失,无法解密客户端留存的Identity.Application加密Cookie,导致系统判定用户未登录。你的原有登录逻辑、Cookie配置均无问题,需求本身不存在逻辑缺陷,仅需补充密钥持久化配置即可解决。
适配.NET Core 3.1的修复步骤
1. 新增Data Protection持久化配置
在Startup.cs的ConfigureServices方法中新增如下配置,将加密密钥持久化到本地非公开目录:
using Microsoft.AspNetCore.DataProtection; using System.IO; // 建议放在服务注册逻辑的靠前位置 services.AddDataProtection() // 替换为你站点下的非公开可写目录,推荐使用App_Data下的独立目录,提前给站点运行身份授予读写权限 .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(Env.ContentRootPath, "App_Data", "Keys"))) // 自定义密钥有效期,到期会自动生成新密钥,旧密钥仍会保留用于解密历史Cookie .SetDefaultKeyLifetime(TimeSpan.FromDays(180));
注意:确保App_Data/Keys目录未放在wwwroot公开目录下,避免密钥文件被外部直接下载。
2. 无需额外修改原有逻辑
Identity的Cookie认证为无状态设计,本身不依赖服务端Session存储,只要密钥可正常解密Cookie,SignInManager和UserManager就可以自动读取到当前登录用户信息,完全不需要额外开发自动重登逻辑。
3. 效果验证
配置完成部署后,手动重启对应IIS应用池,刷新已登录的页面,即可看到用户仍保持登录状态,不再受5分钟应用池回收的影响,原有3天滑动有效期的配置会正常生效。
内容的提问来源于stack exchange,提问作者User123456
相关产品推荐
相关产品推荐

