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