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

但願給你3-5分鐘的碎片化學習,多是坐地鐵、等公交,聚沙成塔,水滴石穿,碼字辛苦,若是你吃了蛋以爲味道不錯,但願點個贊,謝謝關注。html

Token生成

  咱們知道一旦咱們給API添加[Authorize]後,等因而給資源增長了一道鎖,這時候咱們Postman的時候是訪問不了資源的,以下圖所示:git

  

  這個時候,咱們就須要經過Token來訪問。這裏須要分兩個步驟來作,第一個是進行全局的JWT配置;第二個是生成Token函數的編寫。github

  配置JWT

  該配置在上一節已經實現了,這裏再也不重複,能夠訪問這裏複習。api

    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年有餘,人不堪其憂,吾不改其樂,謝謝您關注。

  

相關文章
相關標籤/搜索