【发布时间】:2021-01-13 05:48:56
【问题描述】:
我在 .Net Core 3.1 中为 SPA 客户端实现双因素身份验证。我已经设置了 Jwt 身份验证,因此应该在成功 2fa 验证后发布不记名令牌。我不确定密码身份验证如何与 2fa 匹配。如果密码有效且 2fa 未启用,则 .Net Core API 可以简单地返回 JWT Bearer 令牌,如果启用 2fa 是我的想法(我没有使用 Identity,所以 UserManager 类不是一个选项):
- 密码验证成功后返回过期的 JWT 令牌(临时令牌)。
- 用户被重新路由到 2FA 屏幕并输入 2FA 代码,然后连同临时令牌一起提交给 API。
- 在服务器中,使用 JwtSecurityTokenHandler.ValidateToken 验证临时令牌,传入 TokenValidationParameters 并设置 ValidateLifetime = false。
- 在验证 2fa 代码和临时令牌后,将返回最终的 JWT 令牌,以在后续 API 调用中用作授权标头。
第 1 步对我来说似乎有点冒险,因为临时令牌没有过期 - 如果攻击者可以访问此令牌,那么他可以暴力破解系统,因为 2FA 代码只有 6 位数字。另一方面,发行一个生命周期较短的令牌,比如 2 分钟,似乎也有风险,因为该令牌现在可以实际用于其他端点。 2FA 流程的一般准则是什么?
【问题讨论】:
-
我的另一个想法是有一个单独的令牌发行者,具有不同的签名密钥,仅用于 2FA 代码。这次我可以发出一个寿命较短的令牌,但仍然不能在其他端点上使用。似乎是个好主意,但仍在寻找其他选择。
标签: .net oauth-2.0 jwt .net-core-3.1 two-factor-authentication