我正在我的asp.net web api 2 web服务(非.net核心(上使用TOTP实现2FA。
该实现使用由Microsoft.AspNet.Identity框架提供的TotpSecurityStampBasedTokenProvider。
当查看Google Authenticator要求时,它列出了秘密需要是一个base32编码的字符串。
如果查看TotpSecurityStampBasedTokenProvider中的代码,它将使用用户的SecurityStamp作为由Identity Framework生成的机密。这是GUID,而不是base32编码的字符串。
根据Google Authenticator的规范,有一个要求是秘密是base32编码的字符串。
如何使用TotpSecurityStampBasedTokenProvider与Google Authenticator一起使用?
问题在于Microsoft.AspNet.Identity.Core提供的TotpSecurityStampBasedTokenProvider实现了3分钟的硬编码时间步长。Google Authenticator使用30秒的默认值,根据提供的文档,不能修改。
这导致两个TOTP计算生成不同的代码,从而导致总是错误的身份验证。
我已经向aspnet.identity的github存储库添加了一张关于这一点的票证。
因此,现在我除了创建自己的totpProvider 外,没有什么可做的了
TotpSecurityStampBasedTokenProvider使用UserManager.CreateSecurityTokenAsync生成用于计算令牌的密码。
该代码依赖于用户ID,并生成一个字节数组,在TOTP设置阶段,该数组通常在屏幕上显示为base-32或QR码。
长话短说,没什么好担心的。