ASP.NET没有魔法——ASP.NET Identity 的“多重”身份

      2020-03-10 03:11      HTML5

  上篇文章介绍了ASP.NET中身份验证的机制与流程,本文将使用代码的来介绍如何实现第三方账户验证与双因子验证。

  本章主要内容有:
  ● 实现基于微软账户的第三方身份验证
  ● 实现双因子身份验证
  ● 验证码机制

实现基于微软账户的第三方身份验证

  在微软提供的ASP.NET MVC模板代码中,默认添加了微软、Google、twitter以及Facebook的账户登录代码(虽然被注释了),另外针对国内的一些社交账户提供了相应的组件,所有组件都可以通过Nuget包管理器安装:

  

  从上图中看到有优酷、微信、QQ、微博等组件,其中一些是微软提供的,一些是其它开发者提供的。而本文将使用微软账户为例来介绍如何实现一个第三方登录。
  注:本章主要代码参考ASP.NET MVC模板代码,所以在文章中只列出关键代码,其余代码与模板中的完全一致。

组件安装及Key申请

  在开发之前首先需要通过Nuget安装Microsoft.Owin.Security.MicrosoftAccount:

  

  另外就是需要去微软的开发者中心使用微软账户创建一个自己的应用信息https://apps.dev.microsoft.com/,并保存应用的ID以及密钥用于对身份验证中间件进行配置:

  

  创建过程如下:
  1. 点击添加应用按钮,进入应用程序注册页面,填写应用名称并点击Create按钮(注:由于我已经有一个名称为My Blog的App,所以下面的Test App的创建流程仅仅是用于演示,后续的身份验证实际上是使用之前创建的My Blog):

  

  2. 在后续页面中点击生成新密码来生成密钥(注:该密码只显示一次,需要在弹出框中复制并保存下来):

  

  3. 添加平台:点击添加平台按钮,添加一个Web平台,并在平台的重定向Url中填入本地调试的地址信息(注:一定需要启动HTTPS并且地址后需要添加signin-microsoft,VS可以在项目的属性中开启SSL,并设置SSL的URL):

  

  

  4. 保存更改。

添加中间件

  在上一篇文章中介绍了,第三方账户身份验证除了特定账户身份验证中间件外,还需要添加一个消极模式的外部Cookie身份验证中间件,所以首先需要在项目的Startup文件中添加一下代码:

  

  然后再在该中间件后加入微软身份验证中间件(注:中间件顺序会影响处理流程,微软身份验证中间件必须在外部Cookie中间件后),并设置上面创建的应用ID及密钥:

  

添加Controller及页面的功能支持

  现在可以说应用中已经支持微软的账户身份验证了,但是在应用中还未提供微软身份验证的入口,以及登陆后用户信息的补全等功能。
  1. 在页面上添加验证入口,在Login页面上加入以下代码,通过AuthenticationManager来获取所有的第三方身份验证方式,并生成对应链接:

  

  

 2. 在AccountController中添加ExternalLogin Action方法(注:该方法主要目的是调用AuthenticationManager的Challenge方法来触发微软身份验证中间件的ResponseChallenge方法来完成页面的跳转):

   

  其中ChallengeResult是一个自定义的ASP.NET MVC Reuslt类型:

  

  3. 加入第三方验证后的回调方法ExternalLoginCallback,该回调方法是获取第三方身份验证后的用户信息,然后在本地数据库中查找该用户,如果存在那么登录成功,否则需要对该用户信息进行补全。

  

  4. 添加第三方账户信息补全页面及Action方法,其中action方法接收到补全的用户信息后完成用户注册功能,但要注意的是第三方账户没有密码,仅仅是在AspNetUserLogins表中添加了第三方验证的信息:

  

 

  运行结果:
  1.访问登录页面出现Microsoft的按钮(注:必须使用HTTPS地址才能正常的使用微软身份验证):

  

  2. 点击微软身份验证按钮后,跳转到微软账户登录页面:

  

  

  3. 完成登录后,由于是第一次登录,所以会跳转到信息补全页面:

  

  输入邮箱后将登录成功:

  

  数据库中的信息:

  

  上图中可以看到无密码,然后在Login表中有一条数据:

  

实现双因子身份验证