将 TotpSecurityStampBasedTokenProvider 用于带有 Google 身份验证器的 TOTP

Using TotpSecurityStampBasedTokenProvider for TOTP with Google Authenticator

我正在 asp.net 网络 api 2 网络服务(非 .net 核心)上使用 TOTP 实施 2FA。

实现使用 Microsoft.AspNet.Identity 框架提供的 TotpSecurityStampBasedTokenProvider

在查看 Google 身份验证器要求时,它列出了秘密需要是 base32 编码的字符串。

如果您查看 TotpSecurityStampBasedTokenProvider 中的代码,它使用用户的 SecurityStamp 作为身份框架生成的秘密。这是一个 GUID 而不是 base32 编码的字符串。

根据 Google Authenticator 的规范要求秘密是 base32 编码的字符串。

如何将 TotpSecurityStampBasedTokenProvider 与 Google 身份验证器一起使用?

TotpSecurityStampBasedTokenProvider uses UserManager.CreateSecurityTokenAsync生成用于计算令牌的密码。

该代码依赖于用户 ID,并生成一个字节数组,通常在 TOTP 设置阶段以 base-32 或 QR 码的形式在屏幕上显示给用户。

长话短说,没什么可担心的。

问题是 TotpSecurityStampBasedTokenProvider provided by Microsoft.AspNet.Identity.Core implements a hardcoded timestep of 3 minutes. Google Authenticator uses a default value of 30 seconds, which can NOT be modified according to the documentation provided.

这会导致两次 TOTP 计算生成不同的代码,从而导致始终错误的身份验证。

关于这个问题我已经给github repository of aspnet.identity加了工单

所以现在我除了创建自己的 totpProvider 没有什么可做的了