1

我在我的 asp.net web api 2 webservice(不是 .net 核心)上使用 TOTP 实现 2FA。

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

在查看 Google Authenticator 要求时,它列出了密钥需要是 base32 编码的字符串。

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

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

如何使用 TotpSecurityStampBasedTokenProvider 与 Google Authenticator 一起使用?

4

2 回答 2

2

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

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

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

于 2018-11-28T09:26:10.210 回答
1

问题是Microsoft.AspNet.Identity.Core提供的TotpSecurityStampBasedTokenProvider实现了3 分钟的硬编码时间步。Google Authenticator 使用默认值30 秒不能根据提供的文档进行修改。

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

我已经在aspnet.identity 的 github 存储库中添加了一张票。

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

于 2018-11-28T15:45:26.470 回答