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

