如何使 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 2.0 中的自定义中间件请求身份验证
没有 ASP.NET 身份的 .NET Core 外部身份验证
如何对 asp.net core Blazor App 中的 oAuth 身份验证进行故障排除