.net - .Net Core 中的两因素身份验证 - 如何验证令牌
问题描述
我在 .Net Core 3.1 中为 SPA 客户端实现双因素身份验证。我已经设置了 Jwt 身份验证,因此应该在成功 2fa 验证后发布不记名令牌。我不确定密码身份验证如何与 2fa 匹配。如果密码有效且 2fa 未启用,则 .Net Core API 可以简单地返回 JWT Bearer 令牌,如果启用 2fa 是我的想法(我没有使用 Identity,所以 UserManager 类不是一个选项):
- 密码验证成功后返回过期的 JWT 令牌(临时令牌)。
- 用户被重新路由到 2FA 屏幕并输入 2FA 代码,然后连同临时令牌一起提交给 API。
- 在服务器中,使用 JwtSecurityTokenHandler.ValidateToken 验证临时令牌,并使用 ValidateLifetime = false 的设置传入 TokenValidationParameters。
- 验证 2fa 代码和临时令牌后,将返回最终的 JWT 令牌,以在后续 API 调用中用作授权标头。
第 1 步对我来说似乎有点冒险,因为临时令牌没有过期 - 如果攻击者可以访问此令牌,那么他可以暴力破解系统,因为 2FA 代码只有 6 位数字。另一方面,发行一个生命周期较短的令牌,比如 2 分钟,似乎也有风险,因为该令牌现在可以实际用于其他端点。2FA 流程的一般准则是什么?
解决方案
我想出了一个一次性使用令牌,它的寿命很短。一次性令牌使用用户的散列密码和上次登录日期作为签名密钥。这使它成为一次性的,因为用户登录的最后一次登录日期发生了变化。
推荐阅读
- c# - 如何在 SDK V3 上对 Cosmos-db 查询异步运行 LINQ Count
- haskell - 我如何才能纯粹地对异常进行分类?
- cookies - 在购物和结账之间存储变量
- css - 如何在桌子周围均匀地添加边框?
- r - 使用 data.table 在指定关键字之间提取字符串的第一个实例的最佳方法
- sql - 在 Django 中,如何从列表中构建一组标准?
- angular - 有没有办法为服务器端分页启用 MatPaginator 下一个/上一个按钮?
- r - 使用R计算基于多列的列中重复实验结果值的平均值
- swift - SKPaymentQueue.default().add(payment) 被忽略
- python - Keras 可视化工具包抛出`
输入:0 既被馈送又被获取。对于简单的“顺序”模型