我正在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?
答案 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之外,我无所事事