ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal

前言

首先咱们来看一下在ASP.NET时代,Authentication是如何使用的。下面介绍的是System.Web.Security.FormsAuthenticationhtml

// 登陆
System.Web.Security.FormsAuthentication.SetAuthCookie("userName", false);

if(User.Identity.IsAuthenticated) {  // 已认证
    
}

// 退出登陆
System.Web.Security.FormsAuthentication.SignOut();

这是一个最简单的认证用法:web

  1. 用户填写帐号密码并提交登陆;
  2. 服务器应用经过System.Web.Security.FormsAuthentication.SetAuthCookie(string userName, bool createPersistentCookie)来生成Auth Cookie,并返回到browser;
  3. 用户进行下一个操做时,会带上Auth Cookie发到服务器应用;
  4. 服务器应用解析并绑定到Controller.User属性上,经过User.Identity.IsAuthenticated判断用户是否已认证;
  5. 最后经过System.Web.Security.FormsAuthentication.SignOut()来删除Auth Cookie;

想要设置生成的Auth Cookie属性,能够经过修改web.cofig<authentication>配置项:api

<configuration>
  ...
  
  <system.web>
    <authentication mode="Forms" >
      <forms cookieless="UseCookies" domain="" path="" name="" timeout="" loginUrl=""></forms>
    </authentication>
    
  </system.web> 
  
  ....
</configuration>

更多配置项可查看FormsAuthenticationConfiguration服务器

Authentication in ASP.NET Core

虽然ASP.NET与ASP.NET Core的底层设计很不同,但Authentication的基本用法并无太大的改变,一样经过HttpContext.User来判断认证。cookie

ASP.NET的Authorisation是role-based的,而ASP.NET Core的是基于claims-based的(虽然ASP.NET Core一样支持role-based,但这更可能是为了向后兼容,推荐使用claims-based)。less

Claims-based authentication

要理解Claims-based authentication,就必须理解Claim, ClaimsIdentity, ClaimsPrincipal这三者的关系。dom

Claim是对被认证主体特征的一种表述,好比:登陆用户名是...,email是...,用户Id是...,其中的“登陆用户名”,“email”,“用户Id”就是ClaimType。ide

对应现实中的事物,好比驾照,驾照中的“身份证号码:xxx”是一个claim,“姓名:xxx”是另外一个claim。.net

一组claims构成了一个identity,具备这些claims的identity就是ClaimsIdentity ,驾照就是一种ClaimsIdentity,能够把ClaimsIdentity理解为“证件”,驾照是一种证件,护照也是一种证件。设计

ClaimsIdentity的持有者就是ClaimsPrincipal ,一个ClaimsPrincipal能够持有多个ClaimsIdentity,就好比一我的既持有驾照,又持有护照。

举例说明

上面对Claim, ClaimsIdentity, ClaimsPrincipal三者的描述可能还有些不太好理解,下面会举例说明这三者的关系:

以登机为例,在登机前须要完成如下步骤:

  1. 取登机牌
  2. 过安检
  3. VIP区候机(假设你是VIP)

1. 取登机牌

你到了机场,要向客服打印登机牌(虽然如今已是经过机操打印的了),客服问你叫什么名字,并要求出示能证实你名字的相关证书,例如Passport,其中名字就是一个Claim,Passport就是一个ClaimsIdentity

2. 过安检

当你拿到了登机牌(BoardingPass)并准备过安检,此时安检人员要求你出示航班号,此时你拿出登机牌给安检人员查看航班号,其中航班号就是一个Claim,BoardingPass就是一个ClaimsIdentity

3. VIP区候机

当你经过安检进入了候机区,你是机场的VIP,就打算到VIP区休息一下,此时工做人员要求你出示VIP号,你拿出VIP片给工做人员查看,其中VIP号就是一个Claim,VIP片就是一个ClaimsIdentity

上面的每一个步骤若是都不能出示相应的ClaimsIdentity就会被拒绝执行指示,下面的图展现了这个过程:

image

最后所有的ClaimsIdentity表明了你本人,而你就是ClaimsPrincipal

参考资料

相关文章
相关标签/搜索