前面關於.Net Core如何進行用戶認證的核心流程介紹完畢之后,.Net Core 認證系統之Cookie認證源碼解析遠程認證暫時不介紹,后期有時間,我會加上.接下去介紹認證組件是如何和授權組件一起協同工作.源碼的路徑如下,自行去github下載.ok,開始!
1、認證組件的執行流程
Core啟動認證組件的方式很簡單.
和認證系統一樣,都是以中間件的形式提供服務.
驗證有沒有注入授權組件的核心服務.
接下去查看中間件的代碼,如下:
校驗過程就不說了,第一步:
從終結點元數據中讀取打了Authorize的特性的控制器和方法.那么意味這此時控制器已經被注入了,所以一般services.AddMvc()和add.UseMvc()是先於認證組件注入的.
且微軟提示,如果你自定義了一個授權Filter,改變了認證邏輯,可能會造成錯誤,不建議這種方式.因為核心認證組件支持所有的業務擴展,沒必要再去定義額外的Filter.
接着看如下代碼:
AuthorizationPolicy類合並了需要認證的元數據和認證策略提供類.那去找找IAuthorizationPolicyProvider接口的實現,如下
在注入服務的時候,微軟注入了默認的實現,又是Provider模式,Core底層大量采用了這個模式,所以如果你不知道,先去補補設計模式的知識點,可以參考本人的設計模式分類.這個設計模式很簡單.不看代碼就能猜出大致的實現,內部肯定維護了一個鍵值對,Dic或者HashMap.那就去看看.
調用了AuthorizationOptions參數中的GetPolicy方法,對應
果然是個字典.這意味這我們可以通過認證參數來配置認證策略,添加策略的方法如下:
ok,再去看看AuthorizationPolicy的構造,其維護了兩個主要的屬性,后面會介紹.
一個認證方案的名稱和一個授權條件集合,到這里可以知道認證組件可以和授權組件集成到一起使用的結論.
講到這,回到中間件
_prolicyProvider提供的是認證方案的名稱和授權條件集合,以及需要被認證的元數據集合.
接着,看看AuthorizationPolicy.CombineAsync的實現
跳過參數校驗,分析核心代碼,第一步:
遍歷需要授權的元數據集合
AuthorizationPolicyBuilder,授權策略Buidler生成器,負責生成授權策略。Buidler生成器模式,不懂其移步本人設計模式分類,很簡單.
判斷需要授權元數據的Policy屬性,ok,到這里.很明顯.我們得看看Authorize特性
這個時候
紅框里得值就為"自定義授權策略",接着通過policyProvider拿到對應得AuthorizationPolicy實例,本質就是認證策略名稱為"自定義授權策略"的認證方案和授權條件集合.
接着通過policyBuilder將認證策略名稱為"自定義授權策略"的認證方案和授權條件集合.
添加到AuthorizationPolicyBuilder實例的下面兩個屬性中去
此時,當你這樣設置控制器或者其下的方法
說明你不在采用授權組件的默認策略,所以
接着
又去判斷當前需要授權元數據的Authorize特性中是否設置了Roles特性,且可以設置多個,以","分隔
到這里說明自定義策略授權和Role授權是可以共存的,可以向下面這樣
接着
這個方法本質,就是向AuthorizationPolicyBuilder實例的
追加授權條件.
簡單說下為什么微軟要給授權組件預留Roles角色集合,因為當前市面上主流的權限設計系統都是RBAC模式,中文就是基於角色(Role)的權限管理系統.
接着
這里和角色一樣不介紹了
到這里你會發現 基於認證方案授權策略+基於角色的授權策略=自定義策略的授權策略.
接着,如果沒有任何控制器或者方法使用授權策略,那么使用最基本的拒絕匿名訪問api策略
核心代碼如下:
如果當前用戶未認證,則不能訪問.
當然這個策略也可以通過AuthorizationOptions參數進行重寫.
最后
去重構建一個新的PolicyBuilder對象實例.
接着
執行PolicyBuilder中的用戶認證,其中做了一些重復登陸的處理.本質就是如此.
這段代碼就可以看出.如果當前用戶未登陸,則返回
接着回到中間件
認證完畢之后,如果當前元數據打了AllowAnonymous特性像下面這樣
執行下一個中間件.但是上面的認證操作會做.
最后
調用授權服務,進行授權校驗.默認的授權服務注入點如下:
構建授權上下文,接着拿到所有的授權處理器.遍歷執行
這個參數,可配置,當一個授權策略校驗失敗,便不再執行接下去的授權策略.
最后返回授權結果
總結:本質就是將
特性中的這兩個參數,交給IAuthorizationHandler授權處理器處理.當然如果你制定了認證方案,那么則會去判斷當前用戶是否登陸.
整個流程結束.純屬個人理解,能力有限,有問題,請指正,謝謝.
接下去會寫一篇動態授權的文章,這樣就能將授權組件+認證組件+權限系統集合起來實現完成用戶認證和api動態授權.為后期的前端后端分離架構-基於id4的password模式+JwtBear認證+identity的授權認證中心做准備.最后形成一個完整的授權認證中心.
g