ASP.NET Core 6 MVC应用有效Cookie下会话仍提前过期的解决方法
问题根源分析
你的会话在1小时后过期,主要是以下几个配置问题导致:
- Cookie认证未明确设置
ExpireTimeSpan,默认有效期为1小时,覆盖了你在SignInAsync中设置的12小时过期时间 - Session配置错误:在
Configure方法中直接实例化SessionOptions覆盖了ConfigureServices的配置,且未设置IdleTimeout(默认仅20分钟) - 中间件顺序错误:
UseSession应在UseAuthentication之前,UseCookiePolicy需在UseSession之前加载
修正后的完整配置
1. ConfigureServices方法配置
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Login"; options.AccessDeniedPath = "/Error/AccessDenied"; // 设置认证Cookie的有效期为12小时 options.ExpireTimeSpan = TimeSpan.FromHours(12); // 启用滑动过期:用户活动时自动刷新Cookie有效期 options.SlidingExpiration = true; // 配置Cookie属性,与认证有效期保持一致 options.Cookie.Name = ".AspNetCore.Cookies"; options.Cookie.Expiration = TimeSpan.FromHours(12); options.Cookie.HttpOnly = true; options.Cookie.SameSite = SameSiteMode.None; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境强制HTTPS }); services.AddAuthorization(options => { options.AddPolicy("TemplateAdmin", policy => policy.RequireRole("Administrator", "Helpdesk-Admin")); }); // 配置Session services.AddDistributedMemoryCache(); services.AddSession(options => { options.IdleTimeout = TimeSpan.FromHours(12); // 会话空闲超时12小时 options.Cookie.Name = ".AspNetCore.Session.MyApp"; options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; options.Cookie.SameSite = SameSiteMode.None; options.Cookie.Expiration = TimeSpan.FromHours(12); options.Cookie.SecurePolicy = CookieSecurePolicy.Always; }); services.AddMvc(x => x.EnableEndpointRouting = false);
2. Configure方法中间件顺序调整
app.UseStatusCodePagesWithReExecute("/Error/Index"); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); // 必须在UseSession之前加载 app.UseSession(); // 必须在UseAuthentication之前加载 app.UseAuthentication(); app.UseAuthorization(); // 显式添加授权中间件,确保权限验证正常 app.UseAsmEnvironmentMiddleware(); app.UseMvc(routes => { routes.MapRoute( name: "user", template: "{controller=User}/{action=Edit}/{userName}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
3. 登录动作代码优化
await m_HttpContextAccessor.HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddHours(12), IsPersistent = true, AllowRefresh = true // 允许刷新会话,配合滑动过期机制 });
关键说明
- Cookie认证配置:
ExpireTimeSpan控制认证Cookie的最大有效期,SlidingExpiration=true会在用户每次活动时刷新过期时间,避免用户在活跃状态下被强制登出 - Session配置:
IdleTimeout是会话空闲超时时间,需与认证Cookie有效期保持一致;不要在Configure方法中重新实例化SessionOptions,否则会覆盖ConfigureServices中的配置 - 中间件顺序:严格按照
CookiePolicy → Session → Authentication → Authorization的顺序加载,否则会导致Session或认证Cookie无法正常工作
内容的提问来源于stack exchange,提问作者jazza1000
相关产品推荐
相关产品推荐

