【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式
上篇文章我介紹了如何強(qiáng)制令牌過期的實(shí)現(xiàn),相信大家對(duì)IdentityServer4的驗(yàn)證流程有了更深的了解,本篇我將介紹如何使用自定義的授權(quán)方式集成老的業(yè)務(wù)系統(tǒng)驗(yàn)證,然后根據(jù)不同的客戶端使用不同的認(rèn)證方式來集成到統(tǒng)一認(rèn)證平臺(tái)。
.netcore項(xiàng)目實(shí)戰(zhàn)交流群(637326624),有興趣的朋友可以在群里交流討論。
一、自定授權(quán)源碼剖析
當(dāng)我們需要使用開源項(xiàng)目的某些功能時(shí),最好了解實(shí)現(xiàn)的原理,才能正確和熟練使用功能,避免出現(xiàn)各種未知bug問題和出現(xiàn)問題無法解決的被動(dòng)場(chǎng)面。
在使用此功能前,我們需要了解完整的實(shí)現(xiàn)流程,下面我將從源碼開始講解IdentityServer4是如何實(shí)現(xiàn)自定義的授權(quán)方式。
從我之前的文章中我們知道授權(quán)方式是通過Grant_Type的值來判斷的,所以我們自定義的授權(quán)方式,也是通過此值來區(qū)分,所以需要了解自定義的值處理流程。TokenRequestValidator是請(qǐng)求驗(yàn)證的方法,除了常規(guī)驗(yàn)證外,還增加了自定義的驗(yàn)證方式。
從上面代碼可以看出,除了內(nèi)置的授權(quán)方式,其他的都是用ValidateExtensionGrantRequestAsync來進(jìn)行驗(yàn)證,詳細(xì)的驗(yàn)證規(guī)則繼續(xù)分析實(shí)現(xiàn)過程。
從代碼中可以看出,實(shí)現(xiàn)流程如下:
1、客戶端是否配置了自定義的授權(quán)方式。
2、是否注入了自定義的授權(quán)實(shí)現(xiàn)。
3、授權(quán)的scope客戶端是否有權(quán)限。
4、使用自定義的授權(quán)驗(yàn)證方式校驗(yàn)請(qǐng)求數(shù)據(jù)是否合法。
5、判斷是否有有效數(shù)據(jù)信息,可自行實(shí)現(xiàn)接口。
從源碼中,可以發(fā)現(xiàn)流程已經(jīng)非常清晰了,核心類ExtensionGrantValidator實(shí)現(xiàn)了自定義授權(quán)的校驗(yàn)過程,進(jìn)一步分析下此類的代碼實(shí)現(xiàn)。
從上面代碼可以發(fā)現(xiàn),自定義授權(quán)方式,只需要實(shí)現(xiàn)IExtensionGrantValidator接口即可,然后支持多個(gè)自定義授權(quán)方式的共同使用。
到此整個(gè)驗(yàn)證過程解析完畢了,然后再查看下生成Token流程,實(shí)現(xiàn)方法為TokenResponseGenerator,這個(gè)方法并不陌生,前幾篇介紹不同的授權(quán)方式都介紹了,所以直接看實(shí)現(xiàn)代碼。
實(shí)現(xiàn)的代碼方式和客戶端模式及密碼模式一樣,這里就不多介紹了。
最后我們查看下是如何注入IExtensionGrantValidator,是否對(duì)外提供接入方式,發(fā)現(xiàn)IdentityServer4提供了AddExtensionGrantValidator擴(kuò)展方法,我們自己實(shí)現(xiàn)自定義授權(quán)后添加即可,詳細(xì)實(shí)現(xiàn)代碼如下。
二、自定義授權(quán)實(shí)現(xiàn)
現(xiàn)在開始開發(fā)第一個(gè)自定義授權(quán)方式,GrantType定義為CzarCustomUser,然后實(shí)現(xiàn)IExtensionGrantValidator接口,為了演示方便,我新建一個(gè)測(cè)試用戶表,用來模擬老系統(tǒng)的登錄方式。
然后把實(shí)現(xiàn)驗(yàn)證的方法,由于代碼太簡(jiǎn)單,我就直接貼代碼如下。
現(xiàn)在可以定義自定義的授權(quán)類型了,我起名為CzarCustomUserGrantValidator,實(shí)現(xiàn)代碼如下。
這就實(shí)現(xiàn)了自定義授權(quán)的功能,是不是很簡(jiǎn)單呢?然后添加此擴(kuò)展方法。
現(xiàn)在是不是就可以使用自定義授權(quán)的方式了呢?打開PostMan測(cè)試,按照源碼解析和設(shè)計(jì)參數(shù),測(cè)試信息如下,發(fā)現(xiàn)報(bào)錯(cuò),原來是還未配置好客戶端訪問權(quán)限,開啟權(quán)限測(cè)試如下。
三、客戶端權(quán)限配置
在使用IdentityServer4時(shí)我們一定要理解整個(gè)驗(yàn)證流程。根據(jù)這次配置,我再梳理下流程如下:
1、校驗(yàn)客戶端client_id和Client_Secret。
2、校驗(yàn)客戶端是否有當(dāng)前的授權(quán)方式。
3、校驗(yàn)是否有請(qǐng)求scope權(quán)限。
4、如果非客戶端驗(yàn)證,校驗(yàn)賬號(hào)密碼或自定義規(guī)則是否正確。
5、非客戶端驗(yàn)證,校驗(yàn)授權(quán)信息是否有效。
通過此流程會(huì)發(fā)現(xiàn)我們?nèi)鄙偈跈?quán)方式配置,所以請(qǐng)求時(shí)提示上面的提示,既然知道原因了,那就很簡(jiǎn)單的來實(shí)現(xiàn),添加客戶端自定義授權(quán)模式。此信息是在ClientGrantTypes表中,字段為客戶端ID和授權(quán)方式。我測(cè)試的客戶端ID為21,授權(quán)方式為CzarCustomUser,那直接使用SQL語句插入關(guān)系,然后再測(cè)試。
INSERT INTO ClientGrantTypes VALUES(21,'CzarCustomUser');發(fā)現(xiàn)可以獲取到預(yù)期結(jié)果,然后查看access_token是什么內(nèi)容,顯示如下。
顯示的信息和我們定義的信息相同,而且可以通過amr來區(qū)分授權(quán)類型,不同的業(yè)務(wù)系統(tǒng)使用不同的認(rèn)證方式,然后統(tǒng)一集成到認(rèn)證平臺(tái)即可。
四、總結(jié)與思考
本篇我介紹了自定義授權(quán)方式,從源碼解析到最后的實(shí)現(xiàn)詳細(xì)講解了實(shí)現(xiàn)原理,并使用測(cè)試的用戶來實(shí)現(xiàn)自定義的認(rèn)證流程,本篇涉及的知識(shí)點(diǎn)不多,但是非常重要,因?yàn)槲覀冊(cè)谑褂媒y(tǒng)一身份認(rèn)證時(shí)經(jīng)常會(huì)遇到多種認(rèn)證方式的結(jié)合,和多套不同應(yīng)用用戶的使用,在掌握了授權(quán)原理后,就能在不同的授權(quán)方式中切換的游刃有余。
思考下,有了這些知識(shí)后,關(guān)于短信驗(yàn)證碼登錄和掃碼登錄是不是有心理有底了呢?如果自己實(shí)現(xiàn)這類登錄應(yīng)該都知道從哪里下手了吧。
下篇我將介紹常用登錄的短信驗(yàn)證碼授權(quá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簡(jiǎn)易教程(一)之Ocelot是什么
Ocelot簡(jiǎn)易教程(二)之快速開始1
Ocelot簡(jiǎn)易教程(二)之快速開始2
Ocelot簡(jiǎn)易教程(三)之主要特性及路由詳解
Ocelot簡(jiǎn)易教程(四)之請(qǐng)求聚合以及服務(wù)發(fā)現(xiàn)
Ocelot簡(jiǎn)易教程(五)之集成IdentityServer認(rèn)證以及授權(quán)
Ocelot簡(jiǎn)易教程(六)之重寫配置文件存儲(chǔ)方式并優(yōu)化響應(yīng)數(shù)據(jù)
Ocelot簡(jiǎn)易教程(七)之配置文件數(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)
【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第十一章 授權(quán)篇-密碼授權(quán)模式
【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第十二章 授權(quán)篇-深入理解JWT生成及驗(yàn)證流程
【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第十三章 授權(quán)篇-如何強(qiáng)制有效令牌過期
原文地址:?https://www.cnblogs.com/jackcao/p/10330397.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员修仙之路--高性能排序多个文件
- 下一篇: .NET-记一次架构优化实战与方案-前端