上图就是双因子验证的过程,双因子验证实际上也是基于普通验证的,它仅仅是通过配置的形式开启,在身份验证过程中加入了验证码的发送与校验过程,它需要注意以下几点:
1. 在首次登录时和普通验证一样,需要对用户密码、是否被锁定等信息进行验证,然后因为需要双因子验证,所以创建了一个TwoFactorCookie的身份信息并执行了管理器的SignIn方法,该信息保存了通过密码验证的用户名。完成请求后, app.UseTwoFactorSignInCookie方法添加Cookie验证中间件将会把上面创建的TwoFactorCookie身份信息写到Cookie中(注:在管道中添加了多个cookie的验证中间件,但是它的配置和身份验证类型是不同的,这里是根据用户信息的身份验证方式来选择使用哪一个中间件来处理生成Cookie,而ClaimsIdentity构造传入的值就是身份验证方式)。
2. ASP.NET MVC程序通过重定向的方式,将完成第一次验证的请求转到了验证码发送(选择发送方式)及验证码填写页面,填写完验证码并提交后进入第二次验证。
3. 在第二次验证过程中AccountController的VerifyCode方法通过SignInManager的TwoFactorSignInAsync方法完成了验证,该方法的核心是通过AuthenticationManager显式的调用了“TwoFactorCookie”的验证,该验证是 app.UseTwoFactorSignInCookie方法添加的一个消极模式的身份验证中间件。(注:TwoFactorCookie常量的值就是TwoFactorCookie,AuthenticationManager的SignIn方法通过字符串匹配的形式来查找并调用对应的身份验证方法)
这个验证方法就是获取上一次存储的Cookie并解密后得到用户名,获得对应用户信息后,通过UserTokenProvider对验证码进行校验,当所有信息通过校验后,将使用AuthenticationManager的SignIn方法将用户信息添加到请求上下文中(注:关于验证码的生成和校验在后续章节中介绍)。
4. 在VerifyCode请求响应的时候将用户信息通过积极模式的Cookie中间件将用户信息写到Cookie中,该过程与普通验证一致。
注:后续请求与普通验证一致,使用Cookie携带的身份信息,通过积极模式的Cookie身份验证中间件完成身份验证。
外部验证外部验证即将用户的身份验证过程转交给外部服务器(如各大社交平台等),相对于上面两种验证的流程来说,外部验证的流程更为复杂,其流程图如下:
(注:由于流程图太大,将其分为两个部分,第一部分为第三方登录页面的跳转,第二部分为第三方登录完成后重定向回来的ASP.NET身份验证过程)
ASP.NET第三方登录页面的调整流程比较简单,在默认的模板项目中整个功能就是由AccountController中的ExternalLogin Action方法发起的,首先需要的就是在页面上选择一种第三方账号登录方式,提交到服务端后,ExternalLogin方法直接通过AuthencationManager的拒绝(Challenge)方法拒绝当前请求,将请求重定向到了第三方的登录页面。
当第三方登录成功后会重定回AccountController的ExternalLoginCallback,整个流程的说明如下:
1. 首先需要提到的是模板项目在身份验证管道中通过app.UseExternalSignInCookie方法设置了默认的登录验证方式(ExternalCookie)以及添加了一个消极模式的Cookie验证中间件,其验证方式也是ExternalCookie。