首页 > 解决方案 > .Net Core 中的两因素身份验证 - 如何验证令牌

问题描述

我在 .Net Core 3.1 中为 SPA 客户端实现双因素身份验证。我已经设置了 Jwt 身份验证,因此应该在成功 2fa 验证后发布不记名令牌。我不确定密码身份验证如何与 2fa 匹配。如果密码有效且 2fa 未启用,则 .Net Core API 可以简单地返回 JWT Bearer 令牌,如果启用 2fa 是我的想法(我没有使用 Identity,所以 UserManager 类不是一个选项):

  1. 密码验证成功后返回过期的 JWT 令牌(临时令牌)。
  2. 用户被重新路由到 2FA 屏幕并输入 2FA 代码,然后连同临时令牌一起提交给 API。
  3. 在服务器中,使用 JwtSecurityTokenHandler.ValidateToken 验证临时令牌,并使用 ValidateLifetime = false 的设置传入 TokenValidationParameters。
  4. 验证 2fa 代码和临时令牌后,将返回最终的 JWT 令牌,以在后续 API 调用中用作授权标头。

第 1 步对我来说似乎有点冒险,因为临时令牌没有过期 - 如果攻击者可以访问此令牌,那么他可以暴力破解系统,因为 2FA 代码只有 6 位数字。另一方面,发行一个生命周期较短的令牌,比如 2 分钟,似乎也有风险,因为该令牌现在可以实际用于其他端点。2FA 流程的一般准则是什么?

标签: .netoauth-2.0jwt.net-core-3.1two-factor-authentication

解决方案


我想出了一个一次性使用令牌,它的寿命很短。一次性令牌使用用户的散列密码和上次登录日期作为签名密钥。这使它成为一次性的,因为用户登录的最后一次登录日期发生了变化。


推荐阅读