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

ASP.NET Core 6 MVC身份验证超时未触发问题求助

问题分析与解决方案

你的核心问题在于ASP.NET Core Identity默认使用自身封装的Identity.Application认证Scheme,而非你单独配置的CookieAuthenticationDefaults.AuthenticationScheme,导致你设置的Cookie超时规则完全没生效;同时Identity默认会将登录状态持久化到SQL Server数据库中,这就是为什么重启应用后用户依然保持登录的原因。

以下是针对性的解决步骤:

1. 正确配置Identity的应用Cookie

不要单独调用AddCookie,而是通过ConfigureApplicationCookie来配置Identity使用的Cookie,这才是Identity实际会用到的配置项:

// 先注册Identity服务(示例使用AddDefaultIdentity,根据你的实际代码调整)
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

// 配置Identity的应用Cookie
builder.Services.ConfigureApplicationCookie(options =>
{
    options.SlidingExpiration = true;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(2);
    options.AccessDeniedPath = "/Home/Index";
    options.LoginPath = "/Home/Index";
    options.LogoutPath = "/Home/Index";
    options.Cookie.Name = ".TOR";
    // 无需手动设置options.Cookie.Expiration,Identity会自动根据ExpireTimeSpan处理
    // 若希望浏览器关闭后Cookie立即失效,添加以下配置
    options.Cookie.IsEssential = true;
    options.Cookie.HttpOnly = true;
    // 生产环境建议开启SecurePolicy
    // options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});

2. 登录时禁用持久化Cookie

如果你的登录代码中设置了isPersistent: true,Identity会生成持久化Cookie(存储到磁盘),重启浏览器或应用都不会失效。修改登录逻辑:

// 示例登录代码,确保isPersistent设为false
var result = await _signInManager.PasswordSignInAsync(
    userName, 
    password, 
    isPersistent: false, // 关键:禁用持久化登录
    lockoutOnFailure: false
);

3. 清理数据库中的旧持久化登录记录

Identity会将持久化登录信息存储在AspNetUserLogins表中,之前的持久化登录记录会导致用户自动恢复登录状态。直接清空该表的所有记录即可。

4. 调整中间件顺序

确保Program.cs中的中间件顺序正确,Session必须在Authentication之前,Authentication必须在Authorization之前:

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

// 顺序不能错
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

额外优化:缩短安全戳验证间隔

可以缩短Identity的安全戳验证间隔,让系统更快检测到登录状态的变化:

builder.Services.Configure<SecurityStampValidatorOptions>(options =>
{
    options.ValidationInterval = TimeSpan.FromMinutes(1);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:18:07