企業應用架構研究系列二十八:身份認證 Beginning Out With IdentityServer4

溫森特發表於2022-04-28

  在.Netcore 技術棧中,一直在使用了開源元件IdentityService4進行身份管理,其功能的強大和易用性的確很受開發者喜歡,但是最近其開源組織Duende Software 開始對其進行商業收費,不得不探索其它的解決方案。個人認為,其實在.NetCore 本身是提供一套基AspNetCore.Identity解決方案的,我們只需按照自己的架構意圖進行封裝,就可以滿足我們各種型別的需求。

  現在動起手來(Beginning Out With IdentityServer4),開發一個滿足自己業務系統的Identity 服務替換IdentityServer4。開發一套基於Microsoft.AspNetCore.Identity的Identity 的框架,需要設計一下IdentityUser、IdentityRole和 用於生成JWT 的 Claim。已即對應的驗證邏輯和序列化Provider。我們首先看一下Microsoft.AspNetCore.Identity 的設計架構圖,如下圖所示,它是一個分層次的架構,每個層次有自己的職責。基於這個架構,可以從網上下載很多的開源框架和原始碼。

  

  但是,今天我們挑戰的是一套自己的一套簡易的,高適配的框架,因為在專案開發過程中,人員和角色很多情況下,可能已經在現有的第三方平臺上都預定義了,我們的系統需要能夠更快、更容易的適配這些系統。一個可持續發展的社會需要包容的秩序,軟體行業也是如此,我認為一個好的軟體架構設計,要有更高的包容性。所以,我們今天設計的Identity 是一個開放的架構,允許適配現有的人員和角色的框架。

  所以,基於職能分離原則,認證元件只負責Token的業務邏輯處理,包括Token 的生成,驗證,銷燬,以及用RefreshToken進行更新accessToken等功能,而對於持續的Token的序列化工作通過訂閱事件的方式由其它模組進行完成,也可以通過介面定義服務,通過註冊服務的方式進行分離這塊業務。

  

  由於這部分程式碼比較多,我就把核心的程式碼和執行測試的效果貼圖出來,如果有需要原始碼的化,可以聯絡我。

  

 

  執行效果如下圖,生成了目標的JWT格式的token和refreshtoken資訊。

  

  

  通過生成的Token,我們呼叫測試介面,我們就可以進行了認證的驗證,同時,由於Token中基於宣告式的策略,我們定義了Role,還可以對介面進行基於宣告式Role的許可權管理,如下圖所示,只有包含該角色的Token才能訪問該介面。實現了基於netcore 原生的認證和鑑權。後續將繼續增加基於netcore 原生的OpenID的支援。

  

 

相關文章