【发布时间】:2022-01-02 13:04:26
【问题描述】:
我有一个在前端使用 React 并在后端使用 ASP.Net Web API 开发的应用程序。我正在使用 JWT 进行授权。过程是
- 当用户登录并通过身份验证时,会向前端发送 2 个令牌,访问令牌和刷新令牌。访问令牌是 JWT,刷新令牌是随机字符串,刷新令牌存储在数据库中。
- 对于每次对 API 访问令牌的后续调用都附加在标头中,我有一个身份验证过滤器来验证访问令牌。
- 访问令牌过期后,将引发 401 状态并显示错误消息 TokenExpired。
- 前端收到401后,调用刷新令牌API获取刷新令牌
我的问题是我不能有一个身份验证过滤器来验证刷新令牌 API 的访问令牌,因为它会由于访问令牌过期而抛出 401,所以我需要将刷新令牌 API 设为匿名所以它未命中身份验证过滤器。如果我匿名,我将调用数据库以获取为用户存储的刷新令牌,并将其与我从前端收到的令牌进行比较。那么让刷新令牌 API 匿名是否安全,如果不是最好的方法是什么?
【问题讨论】:
-
当您验证访问令牌时,您是否使用来自 JWKS 的公钥来检查签名?如果是这样,它是一个公钥,任何人都可以使用公钥(来自 JWKS 公共 URL 的 RSA/ECDSA)创建任何 JWT 的签名。因此,如果访问令牌是公共的,则不应将其用于身份验证。如果您验证 HMAC签名,那么 JWT 的签名是使用预共享密钥完成的,应该被认为对 auth 敏感,并且通过扩展刷新等于访问令牌。你使用什么样的 JWT,它是做什么用的?跨度>
-
JWT 使用预共享密钥进行签名。由于后端是REST API,无状态,所以jwt用于授权和构造主体对象。
-
@stof 错误,您无法使用公钥签署令牌。令牌使用私钥签名并使用公钥验证。这也不是 OP 的问题。
-
@Jps 是正确的,不同意规范。您指的是 HMAC 变体,它需要一个您可能认为是私钥的预共享密钥,但规范设计 RSA/ECDSA 是为了加密。因此,只有一方可以持有私钥并且永远不会共享它,这意味着一方只能创建签名,如果他们没有私钥,另一方无法重新创建该签名 fkr 验证.. 这是荒谬的.私钥用于解密,共享密钥用于签署 HMAC,或者公钥用于签署加密令牌声明
标签: c# asp.net-web-api jwt