【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式
上篇文章介紹了基于Ids4客戶端授權的原理及如何實現自定義的客戶端授權,并配合網關實現了統一的授權異常返回值和權限配置等相關功能,本篇將介紹密碼授權模式,從使用場景、源碼剖析到具體實現詳細講解密碼授權模式的相關應用。
.netcore項目實戰交流群(637326624),有興趣的朋友可以在群里交流討論。
一、使用場景?
由于密碼授權模式需要用戶在業務系統輸入賬號密碼,為了安全起見,對于使用密碼模式的業務系統,我們認為是絕對可靠的,不存在泄漏用戶名和密碼的風險,所以使用場景定位為公司內部系統或集團內部系統或公司內部app等內部應用,非內部應用,盡量不要開啟密碼授權模式,防止用戶賬戶泄漏。
這種模式適用于用戶對應用程序高度信任的情況。比如是用戶系統的一部分。
二、Ids4密碼模式的默認實現剖析
在我們使用密碼授權模式之前,我們需要理解密碼模式是如何實現的,在上一篇中,我介紹了客戶端授權的實現及源碼剖析,相信我們已經對Ids4客戶端授權已經熟悉,今天繼續分析密碼模式是如何獲取到令牌的。
Ids4的所有授權都在TokenEndpoint方法中,密碼模式授權也是先校驗客戶端授權,如果客戶端校驗失敗,直接返回刪除信息,如果客戶端校驗成功,繼續校驗用戶名和密碼,詳細實現代碼如下。
1、校驗是否存在grantType,然后根據不同的類型啟用不同的校驗方式。
2、啟用密碼授權模式校驗規則,首先校驗傳輸的參數和scope是否存在,然后校驗用戶名密碼是否準確,最后校驗用戶是否可用。
3、運行自定義上下文驗證
通過源碼剖析可以發現,Ids4給了我們很多的驗證方式,并且默認也實現的驗證和自定義的擴展,這樣如果我們需要使用密碼授權模式,就可以重寫IResourceOwnerPasswordValidator來實現系統內部用戶系統的驗證需求。如果需要確認用戶在登錄以后是否被注銷時,可以重寫IProfileService接口實現,這個驗證主要是生成token校驗時檢查。
4、最終生成Token
根據不同的授權模式,生成不同的token記錄。
根據請求的scope判斷是否生成refreshToken,如果標記了offline_access,則生成refreshToken,否則不生成。
5、RefreshToken持久化
當我們使用了offline_access時,就需要生成RefreshToken并進行持久化,詳細的實現代碼如下。
至此,我們整個密碼授權模式全部講解完成,相信大家跟我一樣完全掌握了授權的整個流程,如果需要持久化如何進行持久化流程。
理解了完整的密碼授權模式流程后,使用自定義的用戶體系就得心應手了,下面就開始完整的實現自定義帳戶授權。
三、設計自定義的賬戶信息并應用
為了演示方便,我這里就設計簡單的用戶帳戶信息,作為自定義的哦帳戶基礎,如果正式環境中使用,請根據各自業務使用各自的帳戶體系即可。
下面開始密碼授權模式開發,首先需要重新實現IResourceOwnerPasswordValidator接口,使用我們定義的用戶表來驗證請求的用戶名和密碼信息。
編寫完自定義校驗后,我們需要注入到具體的實現,詳細代碼如下。
剩下的就是把ICzarUsersServices接口實現并注入即可。詳細代碼如下。
最后我們實現倉儲接口和方法,即可完成校驗流程。
現在萬事俱備,之前注入和插入測試用戶數據進行測試了,為了方便注入,我們采用autofac程序集注冊。
然后需要修改ConfigureServices代碼如下,就完成了倉儲和服務層的注入。
為了驗證密碼授權模式信息,這里需要往數據庫插入測試的用戶數據,插入腳本如下。
四、測試密碼授權模式
注意:測試密碼授權模式之前,我們需要對測試的客戶端ClientGrantTypes表添加password授權方式。
打開我們的測試神器Postman,然后開始調試密碼授權模式,測試結果如下圖所示。
是不是很完美,得到了我們想要的授權結果,那我們查看下這個access_token是什么信息,可以使用https://jwt.io/查看到詳細的內容,發現除了客戶端信息和用戶主鍵無其他附加信息,那如何添加自定義的Claim信息呢?
先修改下CzarUsers實體,增加如下代碼,如果有其他屬性可自行擴展。
然后需要把用戶的claims應用到Token,這里我們需要重寫IProfileService,然后把用戶的claim輸出,實現代碼如下。
然后別忘了注入.AddProfileService<CzarProfileService>(),好了現在我們再次測試下授權,最終得到的結果如下所示。
奈斯,得到了我們預期授權結果。
那如何獲取refresh_token呢?通過前面的介紹,我們需要增加scope為offline_access,并且需要設置客戶端支持,因此AllowOfflineAccess屬性需要設置為True,現在來測試下獲取的授權結果。
最終完成了refresh_token的獲取,至此整個密碼授權模式全部講解并實現完成。
五、總結及思考
本篇文章我們從密碼授權模式使用場景、源碼剖析、自定義用戶授權來講解了密碼授權模式的詳細思路和代碼實現,從中不難發現Ids4設計的巧妙,在默認實現的同時也預留了很多自定義擴展,本篇的自定義用戶體系也是重新實現接口然后注入就完成集成工作。本篇主要難點就是要理解Ids4的實現思路和數據庫的相關配置,希望通過本篇的講解讓我們熟練掌握密碼驗證的流程,便于應用到實際生產環境。
上篇的客戶端授權模式和本篇的密碼授權模式都講解完可能有人會存在以下幾個疑問。
1、如何校驗令牌信息的有效性?
2、如何強制有效令牌過期?
3、如何實現單機登錄?
下篇文章我將會從這3個疑問出發,來詳細講解下這三個問題的實現思路和代碼。
相關文章:
AspNetCore中使用Ocelot之 IdentityServer4
Ocelot-基于.NET Core的開源網關實現
.NET Core微服務之基于Ocelot+IdentityServer實現統一驗證與授權
Swagger如何訪問Ocelot中帶權限驗證的API
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
.NET Core微服務之基于Ocelot實現API網關服務
.NET Core微服務之基于Ocelot實現API網關服務(續)
.NET微服務體系結構中為什么使用Ocelot實現API網關
Ocelot簡易教程(一)之Ocelot是什么
Ocelot簡易教程(二)之快速開始1
Ocelot簡易教程(二)之快速開始2
Ocelot簡易教程(三)之主要特性及路由詳解
Ocelot簡易教程(四)之請求聚合以及服務發現
Ocelot簡易教程(五)之集成IdentityServer認證以及授權
Ocelot簡易教程(六)之重寫配置文件存儲方式并優化響應數據
Ocelot簡易教程(七)之配置文件數據庫存儲插件源碼解析
ASP.NET Core中Ocelot的使用:API網關的應用
ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的動態路由
ASP.NET Core中Ocelot的使用:基于服務發現的負載均衡
【.NET Core項目實戰-統一認證平臺】第一章 功能及架構分析
定制Ocelot來滿足需求
【.NET Core項目實戰-統一認證平臺】第三章 網關篇-數據庫存儲配置(1)
【.NET Core項目實戰-統一認證平臺】第四章 網關篇-數據庫存儲配置(2)
【.NET Core項目實戰-統一認證平臺】第五章 網關篇-自定義緩存Redis
【.NET Core項目實戰-統一認證平臺】第六章 網關篇-自定義客戶端授權
【.NET Core項目實戰-統一認證平臺】第七章 網關篇-自定義客戶端限流
【.NET Core項目實戰-統一認證平臺】第八章 授權篇-IdentityServer4源碼分析
【.NET Core項目實戰-統一認證平臺】第九章 授權篇-使用Dapper持久化IdentityServer4
【.NET Core項目實戰-統一認證平臺】第十章 授權篇-客戶端授權
原文地址:https://www.cnblogs.com/jackcao/p/10140688.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker最全教程——从理论到实战(八
- 下一篇: 基于IdentityServer4 实现