【发布时间】:2021-05-28 20:52:10
【问题描述】:
我有一个使用 Web API 创建的 API 端点来创建安全令牌。因此用户在基本授权标头中传递用户名:密码。验证用户名/密码并返回 Json Web Token。
现在我的所有其他执行 GET 或 POST 的端点都将在 Authorization 标头中作为 BEARER 类型传入 JWT。我通常知道这是 BEARER + (jwt) 但它是否可以通过 BEARER + 用户名:(jwt)
我想传递用户名:(jwt) 的原因是,当我验证 jwt 时,我还想从 jwt 声明中提取用户名,并将其与 auth 标头中传递的用户名进行比较,作为额外检查。
这种方法听起来不错,还是我应该完全忘记检查用户名,因为它不会增加任何额外的安全性?
【问题讨论】:
-
正确理解:您将基本身份验证信息与 JWT 一起发送?此外,预定义的声明
sub用于包含用户名。编辑:查看标准化声明的 openid 连接声明定义openid.net/specs/openid-connect-core-1_0.html#StandardClaims -
我在请求 JWT 时发送基本身份验证。收到 JWT 后,我想使用 Bearer Auth 来调用其他 API 端点,我只是问是否可以使用用户名+令牌对,而不是仅在该承载身份验证中发送令牌。至于声明,我在 GetToken 代码中定义声明时使用 ClaimTypes.Name。
-
好的,但我不明白您为什么要发送用户名 + 令牌,因为您可以/可以将其放在令牌内。
-
我在调用其他端点时在想,也许一个坏演员只有两个要调用的项目之一,也许他们有令牌但用户名无效,他们试图传递一个无效的用户名和一个正确的用户名令牌,我可以将用户名拉入令牌并将其与传入的用户名进行比较,作为验证他们是否应该拥有令牌的另一种方式。所以你是说我不需要做额外的检查吗? Joma 还说无法验证用户名。我的想法是可以根据令牌中的那个来验证它。
-
我还想避免只从令牌中提取用户名,然后对用户名进行数据库查找。这是我第一次使用 JWT,我想确保在完成登录过程后,仅仅拥有 Token 就足够了。这个概念让我有点紧张。所以请原谅我的质疑。