【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权
上篇文章【.NET Core項目實戰-統一認證平臺】第五章 網關篇-自定義緩存Redis?我們介紹了網關使用Redis進行緩存,并介紹了如何進行緩存實現,緩存信息清理接口的使用。本篇我們將介紹如何實現網關自定義客戶端授權,實現可以為不同的接入客戶端設置不同的訪問權限。
.netcore項目實戰交流群(637326624),有興趣的朋友可以在群里交流討論。
一、功能描述
網關重點功能之一鑒權,需要實現對不同的客戶端進行授權訪問,禁止訪問未經授權的路由地址,且需要對無權訪問的請求,返回通用的格式。
比如網關有1-10個可用路由,客戶端A只能訪問1-5,客戶端B只能訪問6-10,這時我們就無法通過Ocelot配置授權來進行自定義認證,這塊就需要我們增加自定義的認證管道來實現功能,盡量不影響網關已有的功能。
下面我們就該功能如何實現展開講解,希望大家先理解下功能需求,然后在延伸到具體實現。
二、數據庫設計
我在第三章 網關篇-數據庫存儲配置(1)中講解了我們網關配置信息設計,本篇將在那個基礎上增加客戶端認證需要用到的表的相關設計,設計客戶端授權結構如下。其中客戶端使用的IdentityServer4客戶端表結構。
設計好概念模型后,我們生成物理模型,然后生成數據庫腳本。
設計思想為可以添加自定義的授權組,為每一個授權分配能夠訪問的路由,然后為網關授權的客戶端分配一個或多個授權組,每次客戶端請求時,如果路由設置了授權訪問,就校驗客戶端是否存在路由訪問權限,如果無訪問權限,直接返回401未授權提醒。
感覺是不是很簡單呢?有了這個自定義的客戶端認證,那么我們后端服務可以專注于自己的業務邏輯而無需再過多了進行權限處理了。
三、功能實現
1、功能開啟配置
網關應該支持自定義客戶端授權中間件是否啟用,因為一些小型項目是不需要對每個客戶端進行單獨授權的,中型和大型項目才有可能遇到自定義配置情況,所以我們需要在配置文件增加配置選項。在AhphOcelotConfiguration.cs配置類中增加屬性,默認不開啟,而且需要知道客戶端標識名稱。
那我們如何把自定義的授權增加到網關流程里呢?這塊我們就需要訂制自己的授權中間件。
2、實現客戶端授權中間件
首先我們定義一個自定義授權中間件AhphAuthenticationMiddleware,需要繼承OcelotMiddleware,然后我們要實現Invoke方法,詳細代碼如下。
有了這個中間件,那么如何添加到Ocelot的管道里呢?這里就需要查看Ocelot源代碼了,看是如何實現管道調用的,OcelotMiddlewareExtensions實現管道部分如下,BuildOcelotPipeline里具體的流程。其實我在之前的Ocelot源碼解讀里也講解過原理了,奈斯,既然找到了,那么我們就加入我們自定義的授權中間件即可。
添加使用自定義授權中間件擴展AhphAuthenticationMiddlewareExtensions,代碼如下。
有了這個中間件擴展后,我們就在管道的合適地方加入我們自定義的中間件。我們添加我們自定義的管道擴展OcelotPipelineExtensions,然后把自定義授權中間件加入到認證之后。
有了這個自定義的管道擴展后,我們需要應用到網關啟動里,修改我們創建管道的方法如下。
代碼很簡單,就是從緩存中查找看是否有數據,如果存在直接返回,如果不存在,就從倉儲中提取訪問權限,然后寫入緩存,寫入緩存的時間可由配置文件寫入,默認為30分鐘,可自行根據業務需要修改。
現在我們還需要解決2個問題,這個中間件才能正常運行,第一IClientAuthenticationRepository接口未實現和注入;第二IOcelotCache<ClientRoleModel>未注入,那我們接下來實現這兩塊,然后就可以測試我們第一個中間件啦。
新建SqlServerClientAuthenticationRepository類,來實現IClientAuthenticationRepository接口,實現代碼如下。
現在需要注入下實現,這塊應該都知道在哪里加入了吧?沒錯ServiceCollectionExtensions擴展又用到啦,現在梳理下流程感覺是不是很清晰呢?
builder.Services.AddSingleton<IClientAuthenticationRepository, SqlServerClientAuthenticationRepository>();builder.Services.AddSingleton<IAhphAuthenticationProcessor, AhphAuthenticationProcessor>();再添加緩存的注入實現,到此我們的第一個中間件全部添加完畢了,現在可以開始測試我們的中間件啦。
builder.Services.AddSingleton<IOcelotCache<ClientRoleModel>, InRedisCache<ClientRoleModel();4、測試授權中間件
我們先在數據庫插入客戶端授權腳本,腳本如下。
這塊設置了客戶端2可以訪問路由/cjy/values,客戶端1可以訪問路由/cjy/values 和 /ctr/values/{id},開始使用PostMan來測試這個中間件看是否跟我設置的一毛一樣,各種dotnet run啟動吧。啟動前別忘了在我們網關配置文件里,設置啟動客戶端授權?option.ClientAuthorization = true;,是不是很簡單呢?
為了測試授權效果,我們需要把網關項目增加認證,詳細看代碼,里面就是定義了授權認證,啟動我們默認的認證地址。
測試結果如下,達到我們預期目的。
終于完成了我們的自定義客戶端授權啦,此處應該掌聲不斷。
5、增加mysql支持
看過我前面的文章應該知道,支持mysql太簡單啦,直接重寫IClientAuthenticationRepository實現,然后注入到UseMySql里,問題就解決啦。感覺是不是不可思議,這就是.netcore的魅力,簡單到我感覺到我再貼代碼就是侮辱智商一樣。
6、重構認證失敗輸出,保持與Ocelot一致風格
前面我們定義了未授權使用自定義的ClientRoleModel輸出,最后發現這樣太不優雅啦,我們需要簡單重構下,來保持與Ocelot默認管道一致風格,修改代碼如下。
再測試下未授權,返回狀態為401,強迫癥患者表示舒服多了。
四、總結及預告
本篇我們講解的是網關如何實現自定義客戶端授權功能,從設計到實現一步一步詳細講解,雖然只用一篇就寫完了,但是涉及的知識點還是非常多的,希望大家認真理解實現的思想,看我是如何從規劃到實現的,為了更好的幫助大家理解,從本篇開始,我的源代碼都是一個星期以后再開源,大家可以根據博客內容自己手動實現下,有利于消化,如果在操作中遇到什么問題,可以加.NET Core項目實戰交流群(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
原文地址: https://www.cnblogs.com/jackcao/p/9973765.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 生成验证码
- 下一篇: 如何用ABP框架快速完成项目(面向项目交