【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析
上篇文章我介紹了如何在網關上實現客戶端自定義限流功能,基本完成了關于網關的一些自定義擴展需求,后面幾篇將介紹基于IdentityServer4(后面簡稱Ids4)的認證相關知識,在具體介紹ids4實現我們統一認證的相關功能前,我們首先需要分析下Ids4源碼,便于我們徹底掌握認證的原理以及后續的擴展需求。
.netcore項目實戰交流群(637326624),有興趣的朋友可以在群里交流討論。
一、Ids4文檔及源碼
文檔地址?http://docs.identityserver.io/en/latest/
Github源碼地址?https://github.com/IdentityServer/IdentityServer4
二、源碼整體分析
【工欲善其事,必先利其器,器欲盡其能,必先得其法】
在我們使用Ids4前我們需要了解它的運行原理和實現方式,這樣實際生產環境中才能安心使用,即使遇到問題也可以很快解決,如需要對認證進行擴展,也可自行編碼實現。
源碼分析第一步就是要找到Ids4的中間件是如何運行的,所以需要定位到中間價應用位置app.UseIdentityServer();,查看到詳細的代碼如下。
通過上面的源碼,我們知道整體流程分為這5步實現。接著我們分析下每一步都做了哪些操作呢?
1、app.Validate()為我們做了哪些工作?
校驗IPersistedGrantStore、IClientStore、IResourceStore是否已經注入?
驗證IdentityServerOptions配置信息是否都配置完整
輸出調試相關信息提醒
詳細的實現代碼如上所以,非常清晰明了,這時候有人肯定會問這些相關的信息時從哪來的呢?這塊我們會在后面講解。
2、BaseUrlMiddleware中間件實現了什么功能?
源碼如下,就是從配置信息里校驗是否設置了PublicOrigin原始實例地址,如果設置了修改下請求的Scheme和Host,最后設置IdentityServerBasePath地址信息,然后把請求轉到下一個路由。
這里源碼非常簡單,就是設置了后期要處理的一些關于請求地址信息。那這個中間件有什么作用呢?
就是設置認證的通用地址,當我們訪問認證服務配置地址http://localhost:5000/.well-known/openid-configuration的時候您會發現,您設置的PublicOrigin會自定應用到所有的配置信息前綴,比如設置option.PublicOrigin = "http://www.baidu.com";,顯示的json代碼如下。
可能還有些朋友覺得奇怪,這有什么用啊?其實不然,試想下如果您部署的認證服務器是由多臺組成,那么可以設置這個地址為負載均衡地址,這樣訪問每臺認證服務器的配置信息,返回的負載均衡的地址,而負載均衡真正路由到的地址是內網地址,每一個實例內網地址都不一樣,這樣就可以負載生效,后續的文章會介紹配合Consul實現自動的服務發現和注冊,達到動態擴展認證節點功能。
可能表述的不太清楚,可以先試著理解下,因為后續篇幅有介紹負載均衡案例會講到實際應用。
3、app.ConfigureCors(); 做了什么操作?
其實這個從字面意思就可以看出來,是配置跨域訪問的中間件,源碼就是應用配置的跨域策略。
很簡單吧,至于什么是跨域,可自行查閱相關文檔,由于篇幅有效,這里不詳細解釋。
4、app.UseAuthentication();做了什么操作?
就是啟用了默認的認證中間件,然后在相關的控制器增加[Authorize]屬性標記即可完成認證操作,由于本篇是介紹的Ids4的源碼,所以關于非Ids4部分后續有需求再詳細介紹實現原理。
5、IdentityServerMiddleware中間件做了什么操作?
這也是Ids4的核心中間件,通過源碼分析,哎呀!好簡單啊,我要一口氣寫100個牛逼中間件。哈哈,我當時也是這么想的,難道真的這么簡單嗎?接著往下分析,讓我們徹底明白Ids4是怎么運行的。
第一步從本地提取授權記錄,就是如果之前授權過,直接提取授權到請求上下文。說起來是一句話,但是實現起來還是比較多步驟的,我簡單描述下整個流程如下。
1、執行授權
如果發現本地未授權時,獲取對應的授權處理器,然后執行授權,看是否授權成功,如果授權成功,賦值相關的信息,常見的應用就是自動登錄的實現。
比如用戶U訪問A系統信息,自動跳轉到S認證系統進行認證,認證后調回A系統正常訪問,這時候如果用戶U訪問B系統(B系統也是S統一認證的),B系統會自動跳轉到S認證系統進行認證,比如跳轉到/login頁面,這時候通過檢測發現用戶U已經經過認證,可以直接提取認證的所有信息,然后跳轉到系統B,實現了自動登錄過程。
獲取路由處理器
其實這個功能就是攔截請求,獲取對應的請求的處理器,那它是如何實現的呢?
IEndpointRouter是這個接口專門負責處理的,那這個方法的實現方式是什么呢?可以右鍵-轉到實現,我們可以找到EndpointRouter方法,詳細代碼如下。
源碼功能我做了簡單的講解,發現就是提取對應路由處理器,然后轉換成IEndpointHandler接口,所有的處理器都會實現這個接口。但是IEnumerable<Endpoint>記錄是從哪里來的呢?而且為什么可以獲取到指定的處理器,可以查看如下代碼,原來都注入到默認的路由處理方法里。
通過現在分析,我們知道了路由查找方法的原理了,以后我們想增加自定義的攔截器也知道從哪里下手了。
執行路由過程并返回結果
有了這些基礎知識后,就可以很好的理解var result = await endpoint.ProcessAsync(context);這句話了,其實業務邏輯還是在自己的處理器里,但是可以通過調用接口方法實現,是不是非常優雅呢?
為了更進一步理解,我們就上面列出的路由發現地址(http://localhost:5000/.well-known/openid-configuration)為例,講解下運行過程。通過注入方法可以發現,路由發現的處理器如下所示。
可以請求的地址會被攔截,然后進行處理。
它的詳細代碼如下,跟分析的一樣是實現了IEndpointHandler接口。
通過上面代碼說明,可以發現通過4步完成了整個解析過程,然后輸出最終結果,終止管道繼續往下進行。
路由發現的具體實現代碼如下,就是把結果轉換成Json格式輸出,然后就得到了我們想要的結果。
到此完整的路由發現功能及實現了,其實這個實現比較簡單,因為沒有涉及太多其他關聯的東西,像獲取Token和就相對復雜一點,然后分析方式一樣。
6、繼續運行下一個中間件
有了上面的分析,我們可以知道整個授權的流程,所有在我們使用Ids4時需要注意中間件的執行順序,針對需要授權后才能繼續操作的中間件需要放到Ids4中間件后面。
三、獲取Token執行分析
為什么把這塊單獨列出來呢?因為后續很多擴展和應用都是基礎Token獲取的流程,所以有必要單獨把這塊拿出來進行講解。有了前面整體的分析,現在應該直接這塊源碼是從哪里看了,沒錯就是下面這句。
builder.AddEndpoint<TokenEndpoint>(EndpointNames.Token, ProtocolRoutePaths.Token.EnsureLeadingSlash());他的執行過程是TokenEndpoint,所以我們重點來分析下這個是怎么實現這么復雜的獲取Token過程的,首先放源碼。
執行步驟如下:
驗證是否為Post請求且使用form-data方式傳遞參數(直接看代碼即可)
驗證客戶端授權
詳細的驗證流程代碼和說明如下。
ClientSecretValidator.cs
驗證請求的信息是否有誤
由于代碼太多,只列出TokenRequestValidator.cs部分核心代碼如下,
1、創建生成的結果
TokenResponseGenerator.cs根據不同的認證方式執行不同的創建方法,由于篇幅有限,每一個是如何創建的可以自行查看源碼。
1、寫入日志記錄
為了調試方便,把生成的token相關結果寫入到日志里。
2、輸出最終結果
把整個執行后的結果進行輸出,這樣就完成了整個驗證過程。
四、總結
通過前面的分析,我們基本掌握的Ids4整體的運行流程和具體一個認證請求的流程,由于源碼太多,就未展開詳細的分析每一步的實現,具體的實現細節我會在后續Ids4相關章節中針對每一項的實現進行講解,本篇基本都是全局性的東西,也在講解了了解到了客戶端的認證方式,但是只是介紹了接口,至于接口如何實現沒有講解,下一篇我們將介紹Ids4實現自定義的存儲并使用dapper替換EFCore實現與數據庫的交互流程,減少不必要的請求開銷。
對于本篇源碼解析還有不理解的,可以進入QQ群:637326624進行討論。
相關文章:
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項目實戰-統一認證平臺】第七章 網關篇-自定義客戶端限流
原文地址:https://www.cnblogs.com/jackcao/p/10031828.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第八章 授权篇-IdentityServer4源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OrchardCore 如何实现模块化(
- 下一篇: [译]聊聊C#中的泛型的使用