本篇文章給大家分享的是有關(guān)AspNetCore認(rèn)證授權(quán)代碼怎么寫(xiě),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)專注于惠民網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供惠民營(yíng)銷(xiāo)型網(wǎng)站建設(shè),惠民網(wǎng)站制作、惠民網(wǎng)頁(yè)設(shè)計(jì)、惠民網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造惠民網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供惠民網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
在普通的MVC項(xiàng)目中 我們普遍的使用Cookie來(lái)作為認(rèn)證授權(quán)方式,使用簡(jiǎn)單。登錄成功后將用戶信息寫(xiě)入Cookie;但當(dāng)我們做WebApi的時(shí)候顯然Cookie這種方式就有點(diǎn)不適用了。
在dotnet core 中 WebApi中目前比較流行的認(rèn)證授權(quán)方式是Jwt (Json Web Token) 技術(shù)。Jwt 是一種無(wú)狀態(tài)的分布式身份驗(yàn)證方式,Jwt 是將用戶登錄信息加密后存放到返回的Token中 ,相當(dāng)于用戶信息是存儲(chǔ)在客戶端。Jwt的加密方式有兩種 :對(duì)稱加密與非對(duì)稱加密,非對(duì)稱加密即 RSA 加密的方式。
自己手寫(xiě)認(rèn)證授權(quán)代碼和Jwt的思路是一樣的;不同之處在于:
1、加密方式僅僅是采用的對(duì)稱加密方式 簡(jiǎn)單高效。哈哈!(弊端就是沒(méi)有非對(duì)稱加密更安全);
2、用戶登錄信息主要保存在redis中,即服務(wù)端。
自己寫(xiě)的好處:
1、擴(kuò)展性強(qiáng),可根據(jù)自己的需要進(jìn)行各種擴(kuò)展,比如在驗(yàn)證授權(quán)時(shí)可很方便的添加多設(shè)備登錄擠下線功能等。
2、可隨時(shí)調(diào)整用戶的Token失效時(shí)間。
認(rèn)證及授權(quán)流程
1、先請(qǐng)求登錄接口,登錄成功,為用戶產(chǎn)生一個(gè)Token,
登錄獲取Token 圖片中ticket字段。
2、 客戶端拿到Token在其他請(qǐng)求中將Token信息添加到請(qǐng)求頭中傳遞到服務(wù)端。
開(kāi)發(fā)思路
1、添加一個(gè)過(guò)濾器。在Startup 中ConfigureServices方法里添加一個(gè)Filters 即我們自己授權(quán)代碼類(lèi)。
添加過(guò)濾器之后我們的每次請(qǐng)求都會(huì)優(yōu)先執(zhí)行過(guò)濾器的代碼。在這里我們就可以判斷用戶是否已經(jīng)登錄,從而進(jìn)行攔截沒(méi)有授權(quán)的的請(qǐng)求。
2、登錄并獲取Token
由于添加了IAuthorizationFilter類(lèi)型的過(guò)濾器,所以每個(gè)請(qǐng)求都會(huì)被攔截。所以登錄接口我們需要允許匿名訪問(wèn)。
3、加解密Token
加密:登錄成功后就要產(chǎn)生個(gè)Token了,產(chǎn)生也簡(jiǎn)單。將用戶的唯一信息比如uid或者guid進(jìn)行對(duì)稱式加密。當(dāng)然如果需要對(duì)登錄設(shè)備做區(qū)分或者多設(shè)備登錄擠下線功能時(shí)最好也將登錄設(shè)備一起加密進(jìn)去。
我們都知道 在加密中一般情況下只要加密的數(shù)據(jù)及加密key不變;那么加密后的內(nèi)容也會(huì)一直保持不變。如果我們每次登錄產(chǎn)生的Token一直沒(méi)有任何變化只要這個(gè)Token被泄露了那將很危險(xiǎn)的。竟然我們希望每次登錄產(chǎn)生的Token都有變化。那就要改變加密數(shù)據(jù)或者加密key了。加密數(shù)據(jù)是用戶唯一信息這個(gè)顯然不可能產(chǎn)生變化。所以我們能改變的地方只能是加密key了;我們采用固定key+隨機(jī)key的方式。
因?yàn)榧用躪ey在我們解密時(shí)也是需要一一對(duì)應(yīng)的。所以我們得想辦法將我們的隨機(jī)key告訴我們解密的代碼中。辦法就是 我們將加密后的內(nèi)容(一般情況進(jìn)行base64編碼)再加上隨機(jī)key。(隨機(jī)key一定是固定長(zhǎng)度 不然后面無(wú)法解析拆分)
比如加密內(nèi)容是guid=73e01eab-210d-4d19-a72a-d0d64e053ec0+client=ios 固定key=123654+隨機(jī)key=FEZaaWbyimaWiJHah
即加密過(guò)程:
加密(73e01eab-210d-4d19-a72a-d0d64e053ec0&ios,123654FEZaaWbyimaWiJHah)=M0EzM0ZGRjk2QzgwRDY2RDJDMTdFOEJGRUE0NDI3NEE1RDlFNkU4NDQ0MERFNEIyMkQ5QjM4MjAxODcwj加隨機(jī)keyFEZaaWbyimaWiJHah
所以我們返回給用戶的Token實(shí)際上是包含了隨機(jī)key的。當(dāng)然這個(gè)隨機(jī)key只有我們自己知道。因?yàn)殡S機(jī)key的長(zhǎng)度以及位置只有我們自己知道。這種方式即使我們固定key被泄露了 只要?jiǎng)e人不知道我們隨機(jī)key處理方法也無(wú)濟(jì)于事。
解密:知道加密過(guò)程后就好解密了。拿到用戶提交的Token后首先按照隨機(jī)key的固定位置進(jìn)行截取。將加密內(nèi)容和隨機(jī)key拆開(kāi)。然后將固定key和隨機(jī)key組合一起解密加密的內(nèi)容,取得用戶guid和登錄的客戶端類(lèi)型。
完整加解密代碼
代碼中的ticket代表本文中的Token。代碼中使用的是DES加解密
以上就是AspNetCore認(rèn)證授權(quán)代碼怎么寫(xiě),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。