如何在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
相关产品推荐
相关产品推荐

