aspnet core 2.1中使用jwt从原理到精通一
原理
jwt對所有語言都是通用的,只要知道秘鑰,另一一種語言有可以對jwt的有效性進行判斷;
jwt的組成;Header部分Base64轉化.Payload部分Base64轉化.使用HS256方式根據秘鑰對前面兩部分進行加密后再Base64轉化,其中使用的hs256加密是header部分指定的,也可以通過官網的查看,如下圖:
原理就這么簡單,那究竟用怎樣使用C#來實現呢,又怎么確定它的正確性呢?,請繼續
使用C#實現
我們定義一個今天方法,其中需要使用到Microsoft.IdentityModel.Tokens.dll,asp.net core 2.1再帶,如果其他版本,沒有自帶,需要nuget 一下這個類庫
該方法很簡單,只需要傳入header鍵值對和payLoad鍵值對,然后根據原理進行Base64轉換和hs256加密,接下來我們來使用一個測試類對其進行測試,代碼如下:
先不管后面的驗證,我們先看看其中生成的encodeJwt的值:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJyb2JlciIsImp0aSI6IjY0OWMyYjUxLTE4ZGQtNDEzYy05Yzc5LTI4NWNhMDAxODU2NSIsIm5iZiI6MTU0MDYxMDY2NSwiZXhwIjoxNTQwNjEyNDY1LCJpc3MiOiJyb2Jlcklzc3VlciIsImF1ZCI6InJvYmVyQXVkaWVuY2UiLCJhZ2UiOjMwfQ.7Is2KYHAtSr5fW2gPU1jGeHPzz2ULCZJGcWb40LSYyw
第一部分和第二部分,并不是加密,只是Base64轉換,我們可以通過其他語言輕松轉換回來,如下使用javascript進行轉,window.atob(base64加密) window.btoa(base64解密)
?var header=JSON.parse(window.atob('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'))
如下圖:
我再對payLoa進行轉換回來, var payLoad=JSON.parse(window.atob('eyJzdWIiOiJyb2JlciIsImp0aSI6IjY0OWMyYjUxLTE4ZGQtNDEzYy05Yzc5LTI4NWNhMDAxODU2NSIsIm5iZiI6MTU0MDYxMDY2NSwiZXhwIjoxNTQwNjEyNDY1LCJpc3MiOiJyb2Jlcklzc3VlciIsImF1ZCI6InJvYmVyQXVkaWVuY2UiLCJhZ2UiOjMwfQ')) ?,如下圖:
所以,從這里可以看出來,Base64并不是屬于加密,只是簡單轉換,因此,不能在payLoad中存放重要內容,比如密碼等
?
使用aspnetcore 中自帶的類生成jwt
aspnet core中自帶了一個jwt幫助類,其實原理一樣,對上面做了封裝,豐富了一個內容,我們繼續使用一個靜態方法,如下
它效果和上面一模一樣,如果使用同樣的header 、payload、秘鑰,生成的jwt肯定一樣,這里就不演示了,感興趣的可以自行嘗試;
aspnetcore中如何使用自定義jwt驗證
上面講了那么多,只是為了大家更好的理解如何使用jwt進行驗證,那是jwt是如何進行驗證的呢?,如果一個http請求過來,一般jwt攜帶在http請求頭部的Authorization中;先不看如何獲取,先看看他是如何驗證的,我們再定義個靜態方法,如下:
其中?validatePayLoad 參數是一個自定義的驗證的Fun,執行該Fun方法時會把解密后的payload作為參數傳入進去
我們驗證通過分為兩部分,
第一,必須的(自認為的)
jwt簽名是否正確,請看以上代碼實現
jwt是否在可以時間內,請看以上代碼實現
第二,自定義的(各復雜的,原理就是獲取payLoad 的某個值,然后對這個值進行各種判讀--等于,大于,包含,)
該jwt是不是進入黑名單
?aud==‘roberAudience’
我們來通過一個測試類驗證
如上面,我們可以把jwt中的payload解析出來,然后進行各種復雜的想要的驗證;
其實,aspnet core中的基于角色,用戶、策略,自定義策略的驗證就相當這里的自定義驗證,一下章將詳細說明和對比,這里暫時不講解
看完上面,是不是覺得jwt很簡單就,主要就兩部
創建jwt;
驗證jwt;
以上就是jwt的基本內容,它確實很簡單,不要被aspnet core中的各種寫法給搞暈了,只要是jwt相關的驗證都是基于上面這些東西
下一章節將講述:
在aspnet core中,自定義jwt管道驗證;
在aspnet core中,自定義策略驗證CommonAuthorizeHandler : AuthorizationHandler<CommonAuthorize>
自定義jwt邏輯驗證和原生的角色,用戶,策略,等進行對比
原文地址:?https://www.cnblogs.com/lechengbo/p/9860711.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的aspnet core 2.1中使用jwt从原理到精通一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于明白了 C# 中 Task.Yiel
- 下一篇: [译]ASP.NET Core中使用Me