【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权
上篇文章介紹了如何使用Dapper持久化IdentityServer4(以下簡稱ids4)的信息,并實現了sqlserver和mysql兩種方式存儲,本篇將介紹如何使用ids4進行客戶端授權。
.netcore項目實戰交流群(637326624),有興趣的朋友可以在群里交流討論。
一、如何添加客戶端授權?
在了解如何進行客戶端授權時,我們需要了解詳細的授權流程,在【.NET Core項目實戰-統一認證平臺】第八章 授權篇-IdentityServer4源碼分析一篇中我大概介紹了客戶端的授權方式,本篇再次回憶下客戶端的授權方式,老規則,上源碼。
首先查看獲取token的方式,核心代碼如下。
我們需要詳細分析下第一步客戶端授權信息是如何驗證的?核心代碼如下。
這里幾個方法可以從寫的說明備注里就可以知道什么意思,但是?var parsedSecret = await _parser.ParseAsync(context);這句話可能不少人有疑問,這段是做什么的?如何實現不同的授權方式?
這塊就需要繼續理解Ids4的實現思路,詳細代碼如下。
就是從注入的默認實現里檢測任何一個實現ISecretParser接口方法,通過轉到實現,可以發現有PostBodySecretParser、JwtBearerClientAssertionSecretParser、BasicAuthenticationSecretParser三種方式,然后再查看下注入方法,看那些實現被默認注入了,這樣就清楚我們使用Ids4時支持哪幾種客戶端授權方式。
從上面代碼可以發現,默認注入了兩種分析器,我們就可以通過這兩個方式來做客戶端的授權,下面會分別演示兩種授權方式的實現。
BasicAuthenticationSecretParser
由于代碼比較簡單,就不介紹了,這里直接模擬此種方式授權,打開PostMan,在Headers中增加Authorization的Key,并設置Value為Basic YXBwY2xpZW50JTNBc2VjcmV0,其中Basic后為client_id:client_secret值使用Base64加密。然后請求后顯示如圖所示結果,奈斯,得到我們授權的結果。
PostBodySecretParser
此種認證方式就是從form_data提取client_id和client_secret信息,我們使用PostMan繼續模擬客戶端授權,測試結果如下,也可以得到我們想要的結果。
有了前面的兩個授權方式,我們清楚了首先驗證客戶端的授權信息是否一致,再繼續觀察后續的執行流程,這時會發現TokenRequestValidator中列出了客戶端授權的其他信息驗證,詳細定義代碼如下。
詳細的授權驗證代碼如下,校驗客戶端授權的一般規則。
最終輸出詳細的校驗結果數據,現在整個客戶端授權的完整邏輯已經介紹完畢,那如何添加我們的自定義客戶端授權呢?比如我要給客戶端A開放一個訪問接口訪問權限,下面就開通客戶端A為案例講解。
開通客戶端授權
根據前面介紹的驗證流程,我們清楚首先需要增加客戶端信息,這里起名叫clienta,密碼設置成secreta。上一篇我們介紹了Dapper持久化IdentityServer4的授權信息,所以這里我就直接以SQL語句的方式來演示添加配置信息。詳細的語句如下:
然后我們來測試下新開通的客戶端授權,如下圖所示,可以正常獲取授權信息了,另外一種Basic授權方式可自行測試。
二、如何配合網關認證和授權?
前面使用的是項目自己進行驗證的,正式項目運行時,我們會把請求放到網關中,統一由網關進行認證和授權等操作,內部api無需再次進行認證和授權,那如何實現網關認證和授權呢?
我們可以回憶下之前介紹網關篇時認證篇章,里面介紹的非常清楚。這里我們參照剛才添加的客戶端A為案例增加網關授權,因為我們對外暴露的是網關地址,而不是內部具體認證項目地址。
1、添加網關授權路由
本項目的網關端口為7777,所以網關授權的地址為http://localhost:7777/connect/token,由于為添加網關路由,直接訪問報401,我們首先增加網關的路由信息。
通過PostMan測試,可以得到我們預期的授權信息結果。
然后繼續訪問我們之前配置的授權路由,提示401未授權,這塊就涉及到前面網關篇的知識了,因為我們的網關增加了授權,所以需要增加客戶端授權才能訪問。
2、添加客戶端授權訪問
還記得是如何添加客戶端授權的嗎?詳細介紹參考[【.NET Core項目實戰-統一認證平臺】第六章 網關篇-自定義客戶端授權?,我直接把授權的腳本編寫如下:
--7、插入把客戶端加入測試路由組2INSERT INTO AhphClientGroup ?VALUES(21,2)使用我們剛授權的信息,再次訪問之前配置的需要認證的路由,可以得到我們預期的結果,奈斯,和網關篇的內容完全一致。
注意:在配置完信息后需要清理緩存,因為我們之前做網關時,很多配置信息的讀取使用了緩存。
三、如何統一輸出結果?
作為一塊準備應用到生產環境的產品,可能為各種第三方提供應用支持,那么統一的輸出結果是必須要實現的,比如我們使用微信sdk或其他第三方sdk時,會發現它們都會列出出現錯誤的統一提示,由標識代碼和說明組成,這里我們就需要解決如何標準化輸出問題,自己業務系統輸出標準結果很容易,因為都是自己控制的結果輸出,那么我們網關集成Ocelot、認證集成IdentityServer4,這兩塊如何進行標準化輸出呢?
那開始我們的改造之旅吧,首先我們要明確如果遇到錯誤如何進行輸出,我們定義一個輸出基類BaseResult,詳細的定義如下:
1、網關默認輸出改造
網關這段需要改造錯誤提示的代碼和內容以及異常的輸出結果,首先改造錯誤情況的輸出結果,使用BaseResult統一輸出,這里就需要重寫輸出中間件ResponderMiddleware,下面就開始重寫之旅吧。
新增自定義輸出中間件CzarResponderMiddleware,詳細代碼如下:
然后添加中間件擴展,代碼如下。
最后使用此擴展來接管默認的輸出中間件,詳細代碼如下。
//builder.UseResponderMiddleware();builder.UseCzarResponderMiddleware();好了,網關統一輸出中間件就完成了,是不是很簡單呢?我們來測試下效果吧,PostMan閃亮登場,
奈斯,這才是我們需要的結果,那如何異常會輸出什么呢??我們來模擬下結果,我直接在服務端拋出異常測試。
默認情況會支持輸出異常的堆棧信息。那如何捕獲服務端異常信息呢?我們需要了解在哪里發送了后端請求,通過源碼分析,發現是由HttpRequesterMiddleware中間件做后端請求,這時我們只需要改造下此中間件即可完成統一異常捕獲。改造核心代碼如下:
修改測試后端服務代碼如下,
然后通過網關訪問路由地址http://localhost:7777/ctr/values/1,輸出為{"errcode":500,"errmsg":"請求服務異常"},得到了預期的所有目標,網關統一輸出全部改造完畢。
2、認證的統一輸出改造
這里為了統一風格,我們先查看下Ids4的錯誤提示方式和輸出結果,然后配合源碼可以發現到輸出都是繼承IEndpointResult接口,并定義了各種方式的輸出,且校驗失敗時,輸出的狀態碼都不是200,那么我們可以從這里下手,在網關層增加獨立的判斷,來兼容自定義的輸出。改造代碼如下:
改造完成后,我們隨時請求認證記錄,最終顯示效果如下。
奈斯,輸出風格統一啦,這樣就完美的解決了兩個組件的輸出問題,終于可以開心的使用啦。
四、內容總結
本篇我們詳細的介紹了客戶端授權的原理和支持的兩個授權的方式,并各自演示了調用方式,然后知道了如何在數據庫端新開通一個客戶端的信息,然后介紹了配合網關實現客戶端的授權和認證,并再次介紹了網關端的路由配置情況,最后介紹了如何把網關和認證統一輸出格式,便于我們在正式環境的使用,涉及內容比較多,如果中間實現的有不對的地方,也歡迎大家批評指正。
相關文章:
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
原文地址:https://www.cnblogs.com/jackcao/p/10100621.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NetCore基于EasyNetQ的高级
- 下一篇: [翻译]初试C# 8.0