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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:12:46