.Net Core中的两因素身份验证-如何验证令牌

时间:2020-09-27 12:58:57

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

我正在.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验证传入的TokenValidationParameters中的临时令牌,并设置ValidateLifetime = false。
  4. 在验证2fa代码和临时令牌后,将返回最终的JWT令牌,以用作后续API调用中的授权标头。

第1步对我来说有点冒险,因为临时令牌没有到期-如果攻击者可以访问此令牌,则由于2FA代码只有6位数字,因此他可以强行使用该系统。另一方面,发行具有较短寿命(例如2分钟)的令牌似乎也有风险,因为该令牌现在可以实际在其他端点中使用。关于2FA流程的一般指导原则是什么?

1 个答案:

答案 0 :(得分:0)

我想出了一个使用寿命短的一次性使用令牌。一次性令牌使用用户的哈希密码和上次登录日期作为签名密钥。这使它一次成为用户登录的上次登录日期更改的时间。