.NET Core会话自动过期问题求助(使用Identity框架)
.NET Core Identity会话自动过期问题解决方案
问题描述
登录后无操作6-7分钟即被强制登出;编辑博客15分钟后提交表单,也会因会话过期跳转至登录页,严重影响业务流程。
核心原因
当前配置未显式设置Identity Cookie的有效期及滑动过期策略,默认的Cookie生命周期较短,无法满足业务场景需求。
解决方案
1. 配置Identity Cookie过期与滑动刷新
在AddIdentity配置后添加Cookie选项配置,调整有效期并开启滑动过期,确保用户活动时自动延长会话:
services.AddIdentity<User, Role>(options => { // 原有密码、锁定、登录配置保持不变 options.Password.RequireDigit = true; options.Password.RequiredLength = Configuration.GetValue<int>("Application:Security:Password:RequiredLength"); options.Password.RequireLowercase = Configuration.GetValue<bool>("Application:Security:Password:RequireLowercase"); options.Password.RequireNonAlphanumeric = Configuration.GetValue<bool>("Application:Security:Password:RequireNonAlphanumeric"); options.Password.RequireUppercase = Configuration.GetValue<bool>("Application:Security:Password:RequireUppercase"); options.Password.RequiredUniqueChars = Configuration.GetValue<int>("Application:Security:Password:RequiredUniqueChars"); options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(3); options.Lockout.MaxFailedAccessAttempts = 3; options.SignIn.RequireConfirmedEmail = true; }) .AddEntityFrameworkStores<AppDbContext>() .AddDefaultTokenProviders() .AddErrorDescriber<TurkishIdentityErrorDescriber>(); // 新增Cookie配置 services.ConfigureApplicationCookie(options => { // 设置Cookie绝对过期时间,根据业务调整(示例为2小时) options.ExpireTimeSpan = TimeSpan.FromHours(2); // 开启滑动过期:用户有活动时自动刷新Cookie有效期 options.SlidingExpiration = true; // 登录跳转路径(保持原有业务逻辑) options.LoginPath = "/Account/Login"; // 权限不足跳转路径 options.AccessDeniedPath = "/Account/AccessDenied"; });
2. 会话(Session)补充配置(若项目使用Session)
如果项目依赖Session存储用户状态,需同步配置Session有效期:
// 在ConfigureServices中添加Session配置 services.AddSession(options => { options.IdleTimeout = TimeSpan.FromHours(2); // 与Cookie过期时间保持一致 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
然后在Configure方法中,于UseRouting之后、UseAuthentication之前启用Session:
app.UseRouting(); app.UseSession(); // 新增Session中间件 app.UseAuthentication(); app.UseAuthorization();
3. 多服务器部署的数据保护配置(可选)
若部署在多台服务器上,需配置数据保护密钥持久化,避免服务器间Cookie验证失败:
services.AddDataProtection() .PersistKeysToSqlServer(new SqlConnection(Configuration.GetConnectionString("SqlServer"))) .SetDefaultKeyLifetime(TimeSpan.FromDays(90));
注意事项
- 滑动过期可提升用户体验,但公共设备场景下需提醒用户及时登出,避免会话被延长带来安全风险。
- 对于长时间编辑的表单,若用户无页面交互(纯离线编辑),可适当延长绝对过期时间,或在页面添加定时AJAX请求主动刷新会话。
- 修改配置后需清除浏览器旧Cookie,确保新配置生效。
内容的提问来源于stack exchange,提问作者Ramazan Musluoğlu
相关产品推荐
相关产品推荐

