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

參考資料

相關文章
相關標籤/搜索