【问题标题】:Using TotpSecurityStampBasedTokenProvider for TOTP with Google Authenticator将 TotpSecurityStampBasedTokenProvider 用于 TOTP 和 Google Authenticator
【发布时间】:2018-11-28 09:07:44
【问题描述】:

我正在我的 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?

【问题讨论】:

    标签: c# asp.net-identity totp


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢帕特里克,你能告诉我我需要在 UserManager 上使用哪种方法来获取秘密作为字节 [] 编码为 base-32 以用于设置阶段?我使用的是 UserManager.GetSecurityStampAsync 但这一定是我的实现错误的地方。
    • 那可能是GetSecurityStampAsyncCreateSecurityTokenAsync
    • 你是对的,我使用不正确的编码将秘密编码为字节数组。我应该使用 unicode。感谢您的洞察力!
    • 是的,确实如此。很好,你找到了。
    • 示例项目通常非常有用。例如,请参见此处:github.com/aspnet/Identity/blob/master/samples/…
    【解决方案2】:

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

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

    我已为此向github repository of aspnet.identity 添加了一张票。

    所以现在我除了创建我自己的 totpProvider 之外别无他法

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 2014-10-12
      • 2012-01-09
      • 2022-11-04
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      相关资源
      最近更新 更多