C# 通过Google Authenticator为TOTP使用TotpSecurityStampBasedTokenProvider

C# 通过Google Authenticator为TOTP使用TotpSecurityStampBasedTokenProvider,c#,asp.net-identity,totp,C#,Asp.net Identity,Totp,我在asp.net web api 2 web服务(而不是.net core)上使用TOTP实现2FA 该实现使用Microsoft.AspNet.Identity framework提供的 当查看Google Authenticator要求时,它列出了机密需要是base32编码的字符串 如果查看TotpSecurityStampBasedTokenProvider中的代码,它将用户的SecurityStamp用作身份框架生成的机密。这是GUID,不是base32编码的字符串 根据的规范,要求机

我在asp.net web api 2 web服务(而不是.net core)上使用TOTP实现2FA

该实现使用Microsoft.AspNet.Identity framework提供的

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

如果查看TotpSecurityStampBasedTokenProvider中的代码,它将用户的SecurityStamp用作身份框架生成的机密。这是GUID,不是base32编码的字符串

根据的规范,要求机密为base32编码字符串

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

用于生成用于计算令牌的密码

代码依赖于用户ID,并生成一个字节数组,通常在TOTP设置阶段以base-32或QR代码的形式在屏幕上显示给用户

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

问题在于,提供的实现了一个3分钟的硬编码时间步。Google Authenticator使用默认值30秒,根据文档,无法修改该值

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

我已经为这个问题添加了一张罚单


因此,现在除了创建我自己的Totprovider之外,我没有什么可做的了

谢谢你,Patrick,你能告诉我需要在UserManager上使用哪种方法才能将密码作为字节[]编码到base-32中用于安装阶段吗?我使用的是UserManager.GetSecurityStampAsync,但这一定是我实现错误的地方。这可能是
GetSecurityStampAsync
CreateSecurityTokenAsync
。你是对的,我使用了不正确的编码将机密编码到字节数组。我应该使用unicode。谢谢你的洞察力!是的,的确如此。很好,你找到了。示例项目通常非常有用。请参见此处的示例: