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

ASP.NET Core 6 MVC应用登出异常:执行登出后User.Identity.IsAuthenticated仍为true

ASP.NET Core 6 MVC登出后User.Identity.IsAuthenticated仍为True的解决办法

问题根源

  1. 你同时启用了**Negotiate(Windows集成认证)**和自定义Cookie认证,默认认证方案为Negotiate,但登出逻辑仅处理了Cookie,未清除Negotiate的身份信息。
  2. SignOutAsync使用的是默认Cookie认证方案名,与你自定义的"Cookies"方案名不匹配,导致Cookie登出操作无效。
  3. 手动删除Cookie时未指定匹配的Path、Domain等配置,无法彻底清除目标Cookie。
  4. 手动设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:09:57