在 .net core api 中存储/验证存储在 HttpOnly cookie 中的 JWT 令牌

Posted

技术标签:

【中文标题】在 .net core api 中存储/验证存储在 HttpOnly cookie 中的 JWT 令牌【英文标题】:Store/validate JWT token stored in HttpOnly cookie in .net core api 【发布时间】:2020-08-09 04:11:20 【问题描述】:

我将基于 jwt 的身份验证添加到我的 api,将令牌添加到标头(授权:Bearer tokenhere)。

我研究了如何在客户端存储它,最推荐的方法是使用 HttpOnly cookie,它是在服务器上设置的,因此客户端代码无法访问它。浏览器将获取它并将其附加到未来的请求中。

为此,服务器必须在响应中写入此 cookie,并且能够验证它而不是标头中的令牌(授权:Bearer tokenhere)。

如何设置?我搜索了how和low,并没有找到这方面的教程,它是cookie或jwt,从未将jwt存储为httponly cookie。

【问题讨论】:

【参考方案1】:

我找到了 2 个答案:

-捕获请求并将令牌从 cookie 移动到标头作为身份验证承载,因此当它开始处理 jwt 身份验证时,它会像这样得到它 (How to properly refresh a token using JWT + HttpOnly Cookie?)

-覆盖 jwt 处理程序事件并覆盖从 cookie 中读取的令牌 (In ASP.NET Core read JWT token from Cookie instead of Headers)

将其写入 cookie 没什么大不了的,在登录方法中我只是这样做:

HttpContext.Response.Cookies.Append("access_token", tokens.AccessToken, new CookieOptions  HttpOnly = true );

【讨论】:

【参考方案2】:

你说的是一个web api,所以你不需要存储它。您基本上需要检查到达您的 Web api 的每个请求是否有有效的不记名令牌。 保存令牌/cookie的场景发生在有问题的用户代理时,在这种情况下,您启动用户会话并将会话ID保存在cookie中,在每个后续请求中都会将其传递给您的服务器,这就是您的方式知道是同一个用户。

即使在后一种情况下,人们也选择不将这些令牌保存在 cookie 中,以防止 cookie 变大。关键是您不需要,您对用户进行身份验证,并将他的角色、身份等保存在您网站的会话中,因此不再需要令牌。 然而,对于 web api,没有状态,您应该验证每个请求是否存在不记名令牌。

【讨论】:

我会改写我原来的帖子。我的意思是客户需要了解它(存储它)。要么是内存,但生命周期不够,本地存储/客户端处理的 cookie(不安全,因为 js 可以访问它),或者我将令牌放入服务器上的 cookie 中,将其标记为 httponly 以便客户端代码不会t 访问它,浏览器将处理它以传递给未来的回调 我很困惑你有什么架构。是网站还是服务器托管的 ui(网络应用)与网络 api 对话? .net 核心后端(restful webapi),角度前端,带有 jwt 令牌生成的自行开发的身份验证 @user1269009 你们每个人都想出了解决方案吗?我也有类似的情况,正在研究如何实现这一目标。

以上是关于在 .net core api 中存储/验证存储在 HttpOnly cookie 中的 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新令牌

在 ASP.NET Core 2.1 Web 客户端中存储不记名令牌的位置

ASP.NET Core 5.0 WebAPI 中的多种身份验证方案

ASP.NET Core 2.0 中 Web API 的本地用户帐户存储

如何在 Asp Net Core Web App(不是 WebAPI)中存储令牌

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值