ASP.NET Core 基于声明的访问控制到底是什么鬼?
從ASP.NET 4.x到ASP.NET Core,內(nèi)置身份驗(yàn)證已從基于角色的訪問控制(RBAC)轉(zhuǎn)變?yōu)榛诼暶鞯脑L問控制(CBAC)。
我們常用的HttpContext.User屬性ASP.NET 4.0時(shí)代是IPrincipal類型,ASP.NETCore現(xiàn)在強(qiáng)化為ClaimsPrincipal類型。
本文就一起來看看這難纏的、晦澀難懂的聲明式訪問控制。
1.Claims : 聲明
聲明是基于聲明的身份驗(yàn)證(claims-based authentication)的基礎(chǔ),聲明是某主題(Subject)的片段信息
聲明是個(gè)名詞,并不能說明主體可以做什么或不能做什么, 對(duì)應(yīng)現(xiàn)實(shí)生活中各種卡片上體現(xiàn)的片段信息。
使用術(shù)語(yǔ)“主題”是因?yàn)槁暶鞑粌H限于描述用戶,聲明可能與應(yīng)用程序,服務(wù)或設(shè)備有關(guān)。
| 身份證 | 身份證號(hào) | 姓名 | 性別 | 籍貫 | 生日 | 簽發(fā)機(jī)關(guān) | 簽發(fā)時(shí)間 | 過期時(shí)間 |
| 工作狗牌 | 姓名 | 級(jí)別 | 花名 | 身份證號(hào) | 性別 | base地區(qū) | 入職時(shí)間 | --- |
| 王者榮耀 | 賬號(hào) | 游戲等級(jí) | 大區(qū) | 角色 | 氪金級(jí)別 | 年齡 | 注冊(cè)時(shí)間 | --- |
| 微信 | 微信號(hào) | 昵稱 | 注冊(cè)時(shí)間 | 國(guó)籍 | 實(shí)名證件 | 手機(jī)號(hào) | --- | --- |
| 車牌 | 車牌編號(hào) | 車牌所屬人 | 車牌地區(qū) | 車牌性質(zhì) | 簽發(fā)時(shí)間 | 簽發(fā)機(jī)關(guān) | --- | --- |
| 某大保健會(huì)員卡 | 卡號(hào) | 姓名 | 手機(jī)號(hào) | 會(huì)員級(jí)別 | 辦卡時(shí)間 | 辦卡門店 | --- | --- |
對(duì)比可見:每個(gè)聲明都有一個(gè)標(biāo)識(shí)片段信息類型的Type屬性、保存片段信息的Value屬性、片段信息的數(shù)據(jù)類型。
var idClaim = new Claim(“Id”,“ 1”,“Integer”);????????//?用戶ID:整形 var?dobClaim?=?new?Claim(“dob”,“04/20/2000”,“Date”);??//?生日:事件類型 var?emailClaim?=?new?Claim(nameof(ClaimTypes.Name),?mockUser.Email,nameof(ClaimValueTypes.String)),2. Identities:身份
同一主題的聲明組合在一起,稱為ClaimsIdentity。
對(duì)應(yīng)現(xiàn)實(shí)生活中各種卡片:身份證、工作狗牌、車牌、大保健會(huì)員卡,均體現(xiàn)了某一個(gè)主題。
public?class?ClaimsIdentity?{public?string?Name?{?get;?}public?IEnumerable<Claim>?Claims?{?get;?}public?string?AuthenticationType?{?get;?}????//?保存使用的身份驗(yàn)證方法(Bearer、Basic)public?bool?IsAuthenticated?{?get;?}//?some?properties?have?been?omitted. }假設(shè)某WebAPI可通過其唯一ID和名稱來識(shí)別用戶。驗(yàn)證從用戶收到的承載令牌(JWT等)后,我們可以創(chuàng)建ClaimsIdentity來表示它們:
ClaimsIdentity?userIdentity?=?new?ClaimsIdentity(new?Claim[]?{new?Claim("Id",?"1"),new?Claim("Username",?"Bert")},"Bearer" );//userIdentity.IsAuthenticated?==?true?since?we?passed?"Bearer"?as?AuthenticationType.3. Principals: 主體
ClaimsIdentity可以方便地表示一個(gè)主題(一組聲明),很多時(shí)候一個(gè)主體有多個(gè)身份,就像現(xiàn)實(shí)生活中我們有個(gè)身份卡片,這個(gè)時(shí)候我們就需要錢包或者賬號(hào)管理工具(1Passwowd、LassPass),將各種身份集中在一起就是主體ClaimsPrincipal。
接上面的例子, 如果WebAPI需要確保訪客使用的設(shè)備處于白名單,則可以對(duì)訪客維護(hù)設(shè)備身份:
ClaimsIdentity?deviceIdentity?=?new?ClaimsIdentity(new?Claim[]?{new?Claim("IP",?"192.168.1.1"),new?Claim("Agent",?"Mozilla/5.0?(Windows?NT?6.1;?Win64;?x64;?rv:47.0)?Gecko/20100101?Firefox/47.0")} ); //??針對(duì)訪客設(shè)備聲明,不要設(shè)置AuthenticationType主體對(duì)象代表代碼運(yùn)行的用戶的安全上下文,是各種有效身份的組合。
public?class?ClaimsPrincipal?{public?IEnumerable<Claim>?Claims?{?get;?}public?IEnumerable<ClaimsIdentity>?{?get;?}public?ClaimsIdentity?Identity?{?get;?}public?virtual?IEnumerable<Claim>?FindAll(Predicate<Claim>?match);public?virtual?bool?HasClaim(string?type,?string?value);//?ClaimsPrincipal提供了一些輔助方法/屬性來檢查聲明. }var?principal?=?new?ClaimsPrincipal(new?IIdentity[]?{?userIdentity,?deviceIdentity?});總結(jié)
基于聲明的身份驗(yàn)證是WebApp獲取它們需要的組織內(nèi)部、其他組織以及Internet上的用戶的身份信息的常用方法。它還為本地或云中運(yùn)行的應(yīng)用程序提供了一致的方法。基于聲明的身份驗(yàn)證將身份和訪問控制的各個(gè)元素抽象為兩個(gè)部分:聲明的概念以及頒發(fā)者或授權(quán)機(jī)構(gòu)的概念。[
Claims:?身份信息的片段數(shù)據(jù)
Identities:各種身份卡片
Principals:主體,各種身份賬戶的集中存儲(chǔ)地
ASP.NET Core端點(diǎn)路由作用原理
臨近年關(guān),修復(fù)ASP.NET Core因?yàn)g覽器內(nèi)核版本引發(fā)的單點(diǎn)登錄故障
ASP.NET?Core結(jié)合Redis實(shí)踐消息隊(duì)列
Quartz.net在集群環(huán)境下部署任務(wù)的姿勢(shì)
ASP.NET Core應(yīng)用注意這一點(diǎn),CTO會(huì)對(duì)你刮目相看
更多精彩
掃碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core 基于声明的访问控制到底是什么鬼?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新版 C# 高效率编程指南
- 下一篇: asp.net ajax控件工具集 Au