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

如何在Plesk中延长ASP.NET Core会话超时时间?

解决ASP.NET Core在Plesk托管下会话20分钟超时的问题

一、修正Program.cs中的重复配置问题

你当前的代码同时使用AddCookie和ConfigureApplicationCookie配置Cookie认证,且ConfigureApplicationCookie中重复赋值OnSigningIn事件(后一个覆盖前一个),会导致配置冲突。请统一配置逻辑,以下是修正后的代码:

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    options.LoginPath = "/Account/Login";
    options.LogoutPath = "/Account/logout";
    options.ExpireTimeSpan = TimeSpan.FromDays(365);
    options.Cookie.MaxAge = options.ExpireTimeSpan;
    options.SlidingExpiration = true;
    options.Cookie.IsEssential = true; 
    options.Cookie.HttpOnly = true;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境启用HTTPS时建议设置
});

// 保持单一配置入口,无需重复定义OnSigningIn
builder.Services.ConfigureApplicationCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromDays(365);
    options.SlidingExpiration = true;
    options.Cookie.IsEssential = true;
    options.Cookie.HttpOnly = true;
    options.Events.OnSigningIn = context =>
    {
        context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(365);
        context.Properties.AllowRefresh = true;
        context.Properties.IsPersistent = true;
        context.CookieOptions.Expires = DateTimeOffset.UtcNow.AddDays(365);
        context.CookieOptions.MaxAge = options.ExpireTimeSpan;
        
        return Task.CompletedTask;
    };
});

二、调整Plesk/IIS应用程序池超时设置

Plesk默认应用程序池闲置超时为20分钟,应用长时间无请求时池会被回收,导致会话状态丢失,这是20分钟超时的核心原因之一。

调整步骤:

  • 登录Plesk面板,进入目标域名管理页
  • 点击「托管设置」> 找到「应用程序池」区域
  • 选择对应ASP.NET Core应用的程序池,点击「编辑」
  • 将「闲置超时(分钟)」设为更大值(如43200,即30天),或设为0禁用闲置超时
  • 保存设置并重启应用程序池

三、配置ASP.NET Core会话状态(若使用Session)

如果应用依赖Session功能,需单独配置Session超时,否则默认20分钟超时也会触发登录跳转:

// 添加Session服务配置
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromDays(365); // 与Cookie超时保持一致
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
    options.Cookie.MaxAge = TimeSpan.FromDays(365);
});

// 管道配置中,确保UseSession在UseAuthentication之前
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();

四、持久化数据保护密钥

ASP.NET Core用数据保护密钥加密认证Cookie,应用程序池回收时默认临时密钥会丢失,导致Cookie无法解密,用户被强制登录。需将密钥持久化到稳定存储:

builder.Services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"C:\inetpub\wwwroot\your-app\dataprotectionkeys"))
    .SetDefaultKeyLifetime(TimeSpan.FromDays(365));

注意:确保指定目录对应用程序池身份有读写权限,可通过Plesk文件管理器调整权限。

五、登录时明确设置持久化Cookie

登录逻辑中调用SignInAsync时必须传入IsPersistent = true,否则即使Cookie配置了持久化也不会生效:

// 示例登录代码片段
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties 
    { 
        IsPersistent = true, // 关键:启用持久化Cookie
        ExpiresUtc = DateTimeOffset.UtcNow.AddDays(365)
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:28:24