首先咱們來看一下在ASP.NET時代,Authentication是如何使用的。下面介紹的是System.Web.Security.FormsAuthentication
:html
// 登陸 System.Web.Security.FormsAuthentication.SetAuthCookie("userName", false); if(User.Identity.IsAuthenticated) { // 已認證 } // 退出登陸 System.Web.Security.FormsAuthentication.SignOut();
這是一個最簡單的認證用法:web
System.Web.Security.FormsAuthentication.SetAuthCookie(string userName, bool createPersistentCookie)
來生成Auth Cookie,並返回到browser;Controller.User
屬性上,經過User.Identity.IsAuthenticated
判斷用戶是否已認證;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。服務器
雖然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,就必須理解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三者的描述可能還有些不太好理解,下面會舉例說明這三者的關係:
以登機爲例,在登機前須要完成如下步驟:
你到了機場,要向客服打印登機牌(雖然如今已是經過機操打印的了),客服問你叫什麼名字,並要求出示能證實你名字的相關證書,例如Passport,其中名字就是一個Claim
,Passport就是一個ClaimsIdentity
。
當你拿到了登機牌(BoardingPass)並準備過安檢,此時安檢人員要求你出示航班號,此時你拿出登機牌給安檢人員查看航班號,其中航班號就是一個Claim
,BoardingPass就是一個ClaimsIdentity
。
當你經過安檢進入了候機區,你是機場的VIP,就打算到VIP區休息一下,此時工做人員要求你出示VIP號,你拿出VIP片給工做人員查看,其中VIP號就是一個Claim
,VIP片就是一個ClaimsIdentity
。
上面的每一個步驟若是都不能出示相應的ClaimsIdentity
就會被拒絕執行指示,下面的圖展現了這個過程:
最後所有的ClaimsIdentity
表明了你本人,而你就是ClaimsPrincipal
。