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


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

Token生成

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

  

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

  配置JWT

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

    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參數進行生成,具體如何生成可以參看源碼邏輯,這里不進行深入探討。

  

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

  

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

  

   使用Token訪問資源

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

  

令牌的定制

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

  

源碼解析

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

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

  

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

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

1.自定義ValidateToken類

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

  

2.配置驗證服務

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

  

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

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

  

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

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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM