Ocelot.JwtAuthorize:一個基於網關的Jwt驗證包

来源:https://www.cnblogs.com/axzxs2001/archive/2018/07/01/9250588.html
-Advertisement-
Play Games

Ocelot作為基於.net core的API方關,有一個功能是統一驗證,它的作用是把沒有訪問許可權的請求擋在API網關外面,而不是到達API網關事端的API時才去驗證;之前我有一篇博文https://www.cnblogs.com/axzxs2001/p/8005084.html,作過說明,這篇博文... ...


Ocelot作為基於.net core的API方關,有一個功能是統一驗證,它的作用是把沒有訪問許可權的請求擋在API網關外面,而不是到達API網關事端的API時才去驗證;之前我有一篇博文https://www.cnblogs.com/axzxs2001/p/8005084.html,作過說明,這篇博文說明瞭實現代碼,今天我把這個實現作了整理,封裝成一個Nuget包,供大家方便調用。

Web API的驗證一般是用UserName和Password請求到Token,然後每次請求需要許可權的API介面是把Token帶到請求的Header中,作為憑據,API服端接收到請求後就要對客戶端帶的Token作驗證,查看Token是否正確,是否過期,如果沒有問題,再對該用戶作權鑒,該用戶是否有許可權訪問本API介面;這樣看來,登錄獲取Tokent算一塊,成功登錄後,每次帶Token請求又分兩塊:一塊是驗證,一塊是鑒權,所以在Ocelot.JwtAuthorize中一共分三塊。

項目的源碼位於https://github.com/axzxs2001/Ocelot.JWTAuthorize

Nuget是https://www.nuget.org/packages/Ocelot.JwtAuthorize

使用也非常簡單,首先有統一的配置文件(網關項目中,API項目中,驗證項目中)

1 "JwtAuthorize": {
2   "Secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
3   "Issuer": "gsw",
4   "Audience": "everyone",
5   "PolicyName": "permission",
6   "DefaultScheme": "Bearer",
7   "IsHttps": false,
8   "Expiration": 50000
9 }
View Code

1、網關項目中在Startup的ConfigureService方法中註入services.AddOcelotJwtAuthorize()即可。

2、驗證項目中在Startup的ConfigureService方法中註入services.AddTokenJwtAuthorize(),同時驗證項目還有一個作用是分發Token,前提是用戶有正確的用戶名密碼,所以要做一個登錄的Colloer和Action來實現,註意登錄時Claim中的信息是在API項目中驗證許可權的信息。

 1 readonly ILogger<LoginController> _logger;
 2 //ITokenBuilder是用來生成Token的
 3 readonly ITokenBuilder _tokenBuilder;
 4 public LoginController(ITokenBuilder tokenBuilder, ILogger<LoginController> logger)
 5        {
 6            _logger = logger;
 7            _tokenBuilder = tokenBuilder;
 8  
 9        }
10        [HttpPost]
11        public IActionResult Login([FromBody]LoginModel loginModel)
12        {
13            _logger.LogInformation($"{loginModel.UserName} login!");
14            if (loginModel.UserName == "gsw" && loginModel.Password == "111111")
15            {
16                var claims = new Claim[] {
17                    new Claim(ClaimTypes.Name, "gsw"),
18                    new Claim(ClaimTypes.Role, "admin"),
19                  
20                };               
21                var token = _tokenBuilder.BuildJwtToken(claims);
22                _logger.LogInformation($"{loginModel.UserName} login success,and generate token return");
23                return new JsonResult(new { Result = true, Data = token });
24            }
25            else
26            {
27                _logger.LogInformation($"{loginModel.UserName} login faile");
28                return new JsonResult(new
29                {
30                    Result = false,
31                    Message = "Authentication Failure"
32                });
33            }
34        }
View Code

3API項目中在StartupConfigureService方法中註入,並且在Controller或Action上加配置文件中的ProlicyName的配置名稱,本例是permission

1 services.AddApiJwtAuthorize((context) =>
2 {
3     //這裡根據context中的Request和User來自定義許可權驗證,返回true為放行,返回fase時為攔截,其中User.Claims中有登錄時自己定義的Claim
4     return true;
5 })
View Code
1     [Authorize("permission")]
2     [Route("api/[controller]")]
3     [ApiController]
4     public class ValuesController : Controller
5     {
6         //……
7     }
View Code

 

具體體安例參照https://github.com/axzxs2001/Ocelot.JWTAuthorize下的Sample



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 閱讀目錄: 1. 網關請求流程 2. Eureka 服務治理 3. Config 配置中心 4. Hystrix 監控 5. 服務調用鏈路 6. ELK 日誌鏈路 7. 統一格式返回 "Java 微服務框架選型(Dubbo 和 Spring Cloud?)" 目前公司使用的 Spring Cloud ...
  • 現在假設有如下構建的游戲伺服器,游戲伺服器有一組gate伺服器,用來驗證客戶端,並且通過gate伺服器來與一組主伺服器,然後主伺服器與關係伺服器進行通信。 其中relation伺服器用來處理各種關係,例如好友關係,師徒關係等。現在有一個玩家A添加玩家B為好友,那麼客戶端發送給服務端的消息流程如上所示 ...
  • 學習更多設計模式請參考:入門設計模式之彙總篇 備忘錄模式:在不破壞封裝的條件下,將一個對象的狀態捕捉住,併在外部化存儲起來,從而可以在將來合適的時候把這個對象還原到存儲時的狀態。 通常的備忘錄模式包含3個角色: 發起人角色:這個角色就是需要被保存狀態的角色 備忘錄角色:負責保存發起人角色的狀態的對象 ...
  • JDK的動態代理是必須掌握的,動態代理的好處就不用我多說了吧 :) 小弟最近在研究mybatis的源碼實現,就開始瞭解mybatis的Mapper代理機制,為什麼介面不用實現類也能代理? 好了,廢話不多說!!! 上代碼 下麵是測試結果: JDK的動態代理要有實現一個InvocationHandler ...
  • 學習更多設計模式請參考:入門設計模式之彙總篇 命令模式:把命令包裝成對象,將命令發送者和命令接受者的耦合降低 舉個例子,皇帝發聖旨招一個大臣入宮。 這裡的皇帝就是客戶端,而聖旨就是命令,大臣就是命令接受者。那麼命令發送者通常都是某個公公對吧。這裡就是一個命令模式的實踐,為什麼這樣說呢?平常我們寫代碼 ...
  • 學習更多設計模式請參考:入門設計模式之彙總篇 責任鏈模式:很多對象由每一個對象對其下家的引用而連接起來行成的一條鏈。 其實責任鏈模式一直在我們的身邊。某一天,董事長有個想法,他吩咐給了經理,經理吩咐給了組長,組長分配給了你我。這時候我們發現,我們沒有下級了呀,咋辦,那就乾唄。 上方這個任務分配的過程 ...
  • Swagger作為WebAPI的文檔工具,廣為人知,Swagger對asp.net core的支持也幾近完美,這篇博文不是對asp.net core中使用Swagger作介紹,因為社區博客作了詳細說明。 今天主要說一下Swagger在Ocelot網關許可權驗證模式下的訪問,以及Swagger請求應答的... ...
  • 一般系統的服務劃分有以下兩種維度: 按模塊劃分 這個比較適用於偏業務的場景:複雜的系統,最好先按業務領域橫向拆分成可獨立部署的子系統,每個子系統內部再按技術縱向拆分成不同的子模塊。 按角色劃分 這個比較適用於基礎服務類的場景:一個大系統,每個服務看起來關聯都很緊密,存在相互的調用關係。這時候可以考慮 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...