Asp.Net Core 2.0注销后User.Identity.IsAuthenticated仍为true的问题
解决Asp.Net Core 2.0 MVC注销后身份仍显示已验证的问题
我来帮你排查这个头疼的问题——注销后身份状态还显示已验证,大概率是中间件顺序不对、注销逻辑没覆盖全Scheme,或者Cookie配置出了问题,按下面的步骤逐一排查:
1. 先检查Configure方法的中间件顺序
Asp.Net Core的中间件顺序是核心中的核心,UseAuthentication()必须放在UseMvc()之前,不然身份验证逻辑根本不会生效,自然注销后状态也不会更新:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 先放其他基础中间件,比如静态文件、异常页 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); // 重点!这两个中间件必须在UseMvc之前 app.UseAuthentication(); app.UseAuthorization(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
2. 注销时要清除所有相关的身份Scheme
Asp.Net Core Identity默认用了多个Scheme(比如应用内登录的IdentityConstants.ApplicationScheme和第三方登录的IdentityConstants.ExternalScheme),只清一个可能漏了:
public async Task<IActionResult> Logout() { // 先调用SignInManager的注销方法 await _signInManager.SignOutAsync(); // 再显式清除所有关联的Scheme,确保不留尾巴 await HttpContext.SignOutAsync(IdentityConstants.ApplicationScheme); await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); return RedirectToAction("Index", "Home"); }
如果之前登录时勾选了「记住我」,持久化Cookie也会被这几句代码一起清除,不用额外处理。
3. 检查Identity的Cookie配置是否合理
要是Cookie被设置成持久化(关闭浏览器也不删),那重启浏览器后身份自然还在。可以在AddIdentity的时候调整Cookie规则:
services.AddIdentity<ApplicationUser, ApplicationRole>() .AddEntityFrameworkStores<AppDbContext>() .AddDefaultTokenProviders() .AddCookie(options => { // 设置Cookie有效期,比如1小时 options.ExpireTimeSpan = TimeSpan.FromHours(1); // 关闭浏览器就删除Cookie,避免持久化残留 options.SlidingExpiration = true; options.Cookie.IsEssential = true; });
4. 排除浏览器缓存的干扰
有时候浏览器会缓存Cookie,哪怕后端已经清除了。你可以手动删掉对应域名下的AspNetCore.Identity.Application这类Cookie,或者直接用隐私窗口测试,能快速排除缓存问题。
5. 验证Identity基础类的继承是否正确
最后确认你的实体类和DbContext继承没错,不然底层身份逻辑会出问题:
// ApplicationUser必须继承IdentityUser public class ApplicationUser : IdentityUser { } // ApplicationRole必须继承IdentityRole public class ApplicationRole : IdentityRole { } // AppDbContext要继承带泛型的IdentityDbContext public class AppDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string> { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } // 你的其他DbSet }
按上面的步骤走一遍,应该就能解决注销后身份状态一直为true的问题了。
内容的提问来源于stack exchange,提问作者Aldemar Cuartas Carvajal
相关产品推荐
相关产品推荐

