5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

希望給你3-5分鐘的碎片化學習,可能是坐地鐵、等公交,積少成多,水滴石穿,碼字辛苦,如果你吃了蛋覺得味道不錯,希望點個贊,謝謝關注。

Token生成

我們知道一旦我們給API添加[Authorize]後,等於是給資源增加了一道鎖,這時候我們Postman的時候是訪問不了資源的,如下圖所示:

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

這個時候,我們就需要通過Token來訪問。這裡需要分兩個步驟來做,第一個是進行全局的JWT配置;第二個是生成Token函數的編寫。

<strong>配置JWT

該配置在上一節已經實現了,這裡不再重複,可以訪問這裡複習。

<strong>Token的生成

這節我們重點是生成Token。首先我們先建立一個Controller.cs並引入類庫:

using Microsoft.IdentityModel.Tokens;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using System.Security.Claims;
using System.Text;
using System.IdentityModel.Tokens.Jwt;

接下來,我們實現核心代碼:為了排版美觀,具體代碼可以訪問我的GitHub地址進行查看。如下圖所示,我們通過核心類JwtSecurityToken以及Issuer,Audience,Credentials參數進行生成,具體如何生成可以參看源碼邏輯,這裡不進行深入探討。

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

Postman上輸入賬號和密碼,返回Token如下圖所示:

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

我們把生成的這一串令牌拿到jwt官網進行驗證,成功通過驗證,如下圖所示:

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

<strong>使用Token訪問資源

有了Token我們就可以安全的訪問我們的資源了,注意這裡的token的生成,為了安全,設置了兩個小時的時間期限,這個可以自己靈活把控。最後我們重新訪問http://localhost:5000/api/values,結果出來了,如下圖所示:

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

令牌的定製

由於實現JWT的框架在Headers默認的KEY是Authorization,而且VALUE必須是bearer+空格+默認加密串。如果你習慣的KEY是用Token,VALUE是自定義的加密串。說白了就是把Authorization換成Token,VALUE的bearer和空格去掉,自由定義加密串(如下圖所示),該怎麼改造呢?

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

<strong>源碼解析

我們找到GitHub的源碼一起來庖丁解牛。

定位到關鍵點:Microsoft.AspNetCore.Authentication.JwtBearer項目下的JwtBearerHandler.cs文件,我們找到了默認實現的代碼,如下圖所示:

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

問題來了,我們是不是要把源碼的Authorization改成Token,然後去掉Bearer和空格呢?如果是這樣做,當然太low了!那麼如何再不修改源碼的情況下做到對擴展的開放呢?

微軟的架構師已經幫我們考慮到擴展性這點了,我們要做的事情就很簡單了,這裡我們分兩步來實現上面的定製:

<strong>1.自定義ValidateToken類

通過實現ISecurityTokenValidator接口我們自定義了一個MyValidateToken類,內部假設我們的token值為myTokenSecret,當然,可以根據項目實際情況選擇自定義加密方式。

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

<strong>2.配置驗證服務

我們在Startup.cs裡通過AddJwtBearer把自定義的Token驗證類添加進來。

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

如上圖所示,這裡還要Clear一下,清除了驗證方式,並重寫Events的OnMessageReceived事件,在事件內部自定義獲取的頭部參數為token,當然你可以任意定義。

最後我們做一個測試,我們輸入參數名稱為token,輸入正確的token值,測試通過!如下圖所示:

5.2基於JWT的令牌生成和定製「深入淺出ASP.NET Core系列」

至此整個改造和定製就算完成了,以上代碼大部分是截圖,截圖看起來更加順眼,雖然不方便複製,如果你想看完整代碼可以訪問我的GitHub地址

希望以上分享對你有幫助,我是IT人張飛洪,入行10年有餘,人不堪其憂,吾不改其樂,謝謝您關注。


分享到:


相關文章: