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

Posted

技术标签:

【中文标题】.Net Core 中的两因素身份验证 - 如何验证令牌【英文标题】:Two Factor Authentication in .Net Core - How To Validate Token 【发布时间】: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 代码。这次我可以发出一个寿命较短的令牌,但仍然不能在其他端点上使用。似乎是个好主意,但仍在寻找其他选择。 【参考方案1】:

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

【讨论】:

以上是关于.Net Core 中的两因素身份验证 - 如何验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

新用户首次登录时强制进行 2 因素身份验证 .NET Core

.NET Core Web API 密钥

两因素 Google 身份验证与服务器上的代码不匹配 - ASP.Net MVC

如何使 ASP.NET Core 中的身份验证 cookie 无效?

如何从.Net Core API 中的身份验证 JWT 令牌中获取身份用户?

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证