ASP.NET Core 6 MVC应用登出异常:执行登出后User.Identity.IsAuthenticated仍为true
ASP.NET Core 6 MVC登出后
User.Identity.IsAuthenticated仍为True的解决办法 问题根源
- 你同时启用了**Negotiate(Windows集成认证)**和自定义Cookie认证,默认认证方案为Negotiate,但登出逻辑仅处理了Cookie,未清除Negotiate的身份信息。
SignOutAsync使用的是默认Cookie认证方案名,与你自定义的"Cookies"方案名不匹配,导致Cookie登出操作无效。- 手动删除Cookie时未指定匹配的
Path、Domain等配置,无法彻底清除目标Cookie。 - 手动设置
HttpContext.User仅对当前请求有效,重定向后的新请求会重新触发认证,因此该操作无实际作用。
修正后的解决方案
1. 调整Program.cs认证配置(可选,明确默认方案)
若业务优先使用Cookie认证,可将默认认证方案指定为自定义的"Cookies",或保持原有配置但登出时同时处理两个方案:
builder.Services.AddAuthentication(options => { // 优先使用Cookie认证作为默认方案 options.DefaultAuthenticateScheme = "Cookies"; options.DefaultChallengeScheme = "Cookies"; }) .AddNegotiate() .AddCookie("Cookies", options => { options.Cookie.Name = "Test"; options.ExpireTimeSpan = TimeSpan.FromMinutes(30); // 统一配置Cookie路径,确保删除时匹配 options.Cookie.Path = "/"; // 若部署到指定域名,需配置Domain // options.Cookie.Domain = "your-domain.com"; }); builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; });
2. 重写Logout动作逻辑
[AllowAnonymous] public async Task<IActionResult> Logout() { // 同时登出Cookie和Negotiate两种认证方案 await HttpContext.SignOutAsync("Cookies"); await HttpContext.SignOutAsync(NegotiateDefaults.AuthenticationScheme); // 按配置参数彻底删除自定义Cookie if (Request.Cookies.ContainsKey("Test")) { Response.Cookies.Delete("Test", new CookieOptions { Path = "/", // Domain = "your-domain.com", // 与AddCookie配置一致 Secure = true, // 若使用HTTPS需开启 HttpOnly = true }); } // 清除Session(若项目启用了Session) HttpContext.Session.Clear(); return RedirectToAction("Login", "Home"); }
关键注意事项
- 覆盖所有启用的认证方案:只要启用了多种认证方式,登出时必须对每个方案执行
SignOutAsync,避免残留身份信息。 - 使用正确的认证方案名:自定义Cookie方案名是
"Cookies",而非默认的CookieAuthenticationDefaults.AuthenticationScheme,必须精准匹配。 - 删除Cookie需匹配配置:删除Cookie时的
CookieOptions要与AddCookie时的配置完全一致,否则浏览器不会执行删除操作。 - 无需手动设置
HttpContext.User:重定向后会发起新请求,该设置无法延续到后续请求,反而可能干扰正常认证流程。
内容的提问来源于stack exchange,提问作者Muhammad Bilal
相关产品推荐
相关产品推荐

