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