将TotpSecurityStampBasedTokenProvider与Google Authenticator一起用于TOTP

时间:2018-11-28 09:07:45

标签: c# asp.net-identity totp

我正在asp.net Web api 2 Web服务(不是.net核心)上使用TOTP实现2FA。

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

在查看Google Authenticator要求时,它会列出该机密必须是以base32编码的字符串。

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

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

如何与Google Authenticator一起使用TotpSecurityStampBasedTokenProvider?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

问题是TotpSecurityStampBasedTokenProvider提供的Microsoft.AspNet.Identity.Core实现了 3分钟的硬编码时间步。 Google身份验证器使用的默认值是 30秒,根据文档provided,该值不能修改

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

我已在github repository of aspnet.identity上添加了一张与此有关的票证。

现在,除了创建自己的totpProvider之外,我无所事事