如何使 ASP.NET Core 中的身份验证 cookie 无效?

Posted

技术标签:

【中文标题】如何使 ASP.NET Core 中的身份验证 cookie 无效?【英文标题】:How do I invalidate an authentication cookie in ASP.NET Core? 【发布时间】:2020-05-07 16:03:41 【问题描述】:

我在使 ASP.NET Core 3.0 中的身份验证 cookie 无效时遇到问题。

场景

我有一个登录网站的用户。当他们单击注销按钮时,它会调用以下代码:

[HttpGet]
public async Task<IActionResult> Logout()

    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    HttpContext.Session.Clear();

    return RedirectToAction("Index", "Home");

这成功清除了浏览器中的所有 cookie,但是,如果我在退出之前获取会话 cookie .AspNetCore.Cookies 的值,然后在以后的请求中将其重新添加,我就可以导航到页面这需要用户身份验证。

谁能帮忙解决这个问题?

注意:最初的问题是关于如何清除用户会话,但后来我意识到这实际上是关于 cookie 本身的问题,而不是服务器端会话。

【问题讨论】:

你试过 Session.Abandon() 吗?这应该只是放弃整个会话 ***.com/a/57976991/9936356 Response.Cookies.Delete(cookie) 这里没有服务器端会话。 cookie 完全 代表用户经过身份验证的会话。您要在这里解决的问题是什么?即为什么这是一个问题? 这不是您通常需要担心的事情。对于使用 TLS 发送的安全、仅限 http 的 cookie,攻击向量非常有限。不过,您可以查看 OnValidatePrincipal 来帮助拒绝身份验证 cookie,但没有内置支持来决定何时这样做。 我解决这个问题的方法是在cookie和数据库中存储一个guid作为连接到用户的会话。如果用户注销,则数据库中的会话将被标记为“注销”,然后此 cookie 将被拒绝为对任何进一步的身份验证有效 - 问题是我必须在每个请求上验证 cookie,但对于我的案例安全很重要。 【参考方案1】:

这就是我的注销方法:

/// <summary>
/// Do the logout
/// </summary>
/// <returns></returns>
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Logout()

    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);

    //Important, this method should never return anything.

这里的技巧是让方法不返回任何内容,因为 SignOut 方法将在内部生成自己的响应给浏览器。

【讨论】:

以上是关于如何使 ASP.NET Core 中的身份验证 cookie 无效?的主要内容,如果未能解决你的问题,请参考以下文章

Asp Net Core 身份验证问题

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证

没有 ASP.NET 身份的 .NET Core 外部身份验证

如何对 asp.net core Blazor App 中的 oAuth 身份验证进行故障排除

如何在 ASP.NET Core 3.1 中启用多重身份验证?

带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时