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

ASP.NET Core 6 MVC应用有效Cookie下会话仍提前过期的解决方法

解决ASP.NET Core 6 MVC Cookie认证会话超时问题

问题根源分析

你的会话在1小时后过期,主要是以下几个配置问题导致:

  1. Cookie认证未明确设置ExpireTimeSpan,默认有效期为1小时,覆盖了你在SignInAsync中设置的12小时过期时间
  2. Session配置错误:在Configure方法中直接实例化SessionOptions覆盖了ConfigureServices的配置,且未设置IdleTimeout(默认仅20分钟)
  3. 中间件顺序错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:56:03