从代码中可以看到该算法是基于rfc6238(TOTP: Time-Based One-Time Password Algorithm,基于时间的一次性密码算法) https://tools.ietf.org/html/rfc6238,然后通过用户的安全戳以及GetUserModifierAsync方法生成特定的信息熵来完成密码加密,关于信息熵可参考:https://www.zhihu.com/question/22178202,上面将生成后的令牌执行ToString("D6")是将其转换为一个6位数字的字符串。
而Token的验证方式和生成差不多都是通过用户安全戳和信息熵来验证提交的验证码(它实际上是一种hash算法):
以上已经解释了最初验证码的生成和验证的问题,所以对于EmailTokenProvider和PhoneNumberTokenProvider只是对熵的生成、对Provider的有效性(是否存在Email或电话号码)、通知方式进行了修改,下面是PhoneNumberTokenProvider相关代码:
小结
本章主要是使用代码的形式实现了ASP.NET中的第三方验证和双因子验证,文中的代码都来自ASP.NET MVC的模板,所以文中仅仅是对关键的代码进行了介绍,一些细节的内容可参考完整代码。其中第三方验证使用的是微软账户,如果有环境支持可以尝试国内的微信、QQ等身份验证。
另外在文章最后对验证码的生成和校验代码进行了分析,知道了它是基于Hash算法的信息加密、验证的机制来实现的。
ASP.NET MVC基于Identity提供了非常完善、强大的用户管理和身份验证功能,除了以上介绍的以外还有账户锁定、注册邮箱或短信验证功能,基本上已经涵盖了现在开发常用的功能,但这些功能被一个模板实现了,所以ASP.NET强大吗?
参考:
https://www.zhihu.com/question/22178202
https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/external-authentication-services
https://www.benday.com/2014/02/25/walkthrough-asp-net-mvc-identity-with-microsoft-account-authentication/
本文链接:
ASP.NET没有魔法——目录