ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证 (3)

  

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

  AuthenticationManagerExtensions是对AuthenticationManager的拓展,主要是对AuthenticationManager添加了外部验证以及双因子验证的补充支持,这些拓展方法被SignInManager以及身份验证Controller使用:

  

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

基于Owin的Identity在ASP.NET中身份验证的解决方案

  上面介绍了Owin以及Identity中主要的组件及其功能,那么在ASP.NET中是如何使用这些功能实现身份验证功能的呢?在ASP.NET中主要把身份验证分为这三种类型:
  ● 普通验证:普通验证就是之前文章中介绍过的基于Cookie的身份验证方式,其过程是用户提交用户名及密码,服务器完成密码验证后生成用户信息,后续请求根据这个用户信息即可验证用户身份。
  ● 双因子验证:双因子验证在普通验证基础上增加了如短信验证码、邮件验证码等信息的二次验证,就是说服务器根据用户名密码完成用户验证后,该用户仍然处于“未通过”的身份验证状态,还需要对发送给客户的验证码进行二次校验后才完成身份验证。
  ● 外部验证:既用户数据在应用程序外部,如各种不同的社交账户,通过这些服务商提供的身份验证接口登陆后,返回一系列的服务访问Token、用户信息等的验证方式。

  这里将通过ASP.NET MVC带身份验证功能的模板代码来介绍以上三种方式是如何使用Identity组件实现的。

普通验证

  Identity在ASP.NET中通过Cookie验证的方式实现了普通的用户身份验证,其主要过程如下(注:左边为主要流程,右边为每一个主流程包含的子流程):

  

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

 

  上图是ASP.NET MVC中通过Identity实现基于Cookie的用户身份验证的用户信息生成过程,它有几个需要注意的点:

  1. 首先将用户名、密码等信息通过可匿名访问的AccountControllter中的Login方法提交到服务器,然后通过SignInManager的PasswordSignInAsync实现了用户名、密码的验证以及登录,最后在请求返回阶段将用户身份信息加密后写到Cookie中。

  2. 在密码验证/登录阶段除了对用户密码进行验证外,还有一些用户是否被锁定、登录失败次数计数以及重置等判断,用于实现用户的锁定以及多次登录失败自动锁定用户等功能。

  3.SignInManager.SignInOrTwoFactor方法根据验证方法的配置决定是双因子验证还是普通验证,在普通验证情况下,通过获取用户身份信息以及新建身份验证属性来完成后续的验证管理器的登入操作(注:上面在介绍身份验证管理器时说过,它的AuthenticateAsync和SignIn方法是连续使用的,前者获取用户信息,后者将用户信息写到请求上下文中,但是因为现在是登录操作,请求中还没有用户身份信息,所以用户身份信息以及验证属性需要自己创造,比如通过数据库获取,这里通过自己创造的用户信息然后调用SignIn方法实现了登录将用户信息写到请求上下文中)。

  4.当请求返回时,将写到请求上下文中的用户信息以Cookie的形式携带到客户端,以便于后续请求的身份验证。

  

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

  上图是当用户通过登录后,访问其它资源时候的身份验证过程,这里整个处理过程都是Cookie验证中间件完成的,需要注意的有以下几点:

  1. Cookie验证中间件默认是积极模式,所以在处理器初始化时就会调用AuthenticateAsync方法,对请求中的身份信息Cookie进行解析、验证。

  2. 当完成身份信息的验证后,该中间件通过AddUserIdentity这个方法将用户信息写到请求上下文中(该方法实际上是替换了AuthenticationManager的SignIn方法)。

  3. 当请求返回阶段,如果状态正常那么继续将身份信息写到Cookie中,但是如果身份验证未通过(如超时等情况),请求就回被处理器的ApplyResponseChallengeAsync处理(如跳转到登录页面等功能)。

双因子验证

  双因子验证是在普通验证的基础上引入了第二次验证,也就是说在登录时会有两次请求:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzsyf.html