如何使 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 无效?的主要内容,如果未能解决你的问题,请参考以下文章