ASP.NET Core Identity生产服务器超时问题排查与解决请求
问题描述
本地IIS部署的站点从未出现超时情况,但生产环境中会话约5分钟后就会自动跳转到登录页。已尝试以下配置但均无效:
项目代码配置
builder.WebHost.ConfigureKestrel(o => o.Limits.KeepAliveTimeout= TimeSpan.FromMinutes(60)); builder.Services.ConfigureApplicationCookie(options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(60); options.SlidingExpiration = true; options.Events.OnSignedIn = c => { c.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(5); return Task.CompletedTask; }; }); builder.Services.AddSession(session => { session.IdleTimeout = TimeSpan.FromMinutes(60); session.IOTimeout = TimeSpan.FromMinutes(60); session.Cookie.Expiration = TimeSpan.FromMinutes(60); }); builder.Services.AddAuthentication() .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.ExpireTimeSpan = System.TimeSpan.FromMinutes(60); });
web.config配置
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/> </handlers> <aspNetCore requestTimeout="01:00:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile="\.\logs\stdout" forwardWindowsAuthToken="false"/> </system.webServer>
甚至尝试硬编码Identity Cookie使其永不过期,仍会在5分钟后被登出,求实现至少60分钟会话时长的解决方案。
解决方案
以下是针对生产环境会话超时问题的排查和修复步骤:
1. 检查生产环境的负载均衡/反向代理配置
如果生产环境使用了负载均衡器或反向代理,这些组件的默认配置可能导致提前断开连接:
- 确认代理服务器的连接超时设置至少为60分钟
- 开启会话粘性(Sticky Session),避免用户请求被分发到不同后端实例导致会话丢失
- 检查代理是否自动覆盖Cookie的过期时间,部分代理会强制修改Cookie有效期
2. 统一身份验证Cookie配置
ASP.NET Core中ConfigureApplicationCookie和AddCookie可能存在配置冲突,优先使用ConfigureApplicationCookie统一配置:
builder.Services.ConfigureApplicationCookie(options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(60); options.SlidingExpiration = true; // 保持Cookie过期时间与会话超时一致 options.Cookie.Expiration = options.ExpireTimeSpan; // 生产环境建议启用HTTPS options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Lax; options.Events.OnSignedIn = context => { context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60); return Task.CompletedTask; }; });
注意:无需重复调用AddCookie,ConfigureApplicationCookie已针对Identity默认Cookie生效。
3. 修正Session中间件注册顺序
Session中间件必须在身份验证中间件之前注册,否则配置不会生效:
// 先注册Session app.UseSession(); // 再注册身份验证相关中间件 app.UseAuthentication(); app.UseAuthorization();
4. 调整IIS应用池回收策略
IIS应用池的自动回收会导致会话丢失,需修改以下设置:
- 打开IIS管理器,进入对应应用池的高级设置
- 将**闲置超时(分钟)**设为60以上,避免应用池因闲置被回收
- 关闭**定期时间间隔(分钟)**的自动回收,或设置为大于60分钟
- 启用回收时允许重叠启动,避免回收期间会话中断
5. 验证Cookie实际生效状态
用浏览器开发者工具(F12)查看生产环境的身份验证Cookie:
- 检查
Expires或Max-Age是否为60分钟后 - 确认
Secure、HttpOnly等属性与配置一致 - 若Cookie有效期仍为5分钟,说明配置未被正确应用,需排查代码执行顺序或环境变量覆盖问题
6. 排查第三方身份验证组件冲突
如果项目使用了OpenIdConnect、OAuth等第三方身份验证库,需在对应组件的配置中明确设置会话超时时间,避免覆盖默认Cookie配置。
内容的提问来源于stack exchange,提问作者Mike_Matthews_II
相关产品推荐
相关产品推荐

