聊聊NET之JWT理解
開(kāi)篇語(yǔ)
本文內(nèi)容參考多位大佬的文章編寫(xiě)而成。
介紹
jwt是一個(gè)基于json的、用于在網(wǎng)絡(luò)上聲明某種主張的令牌,jwt通常是用三部分組成:頭信息,消息體,簽名。他是一種雙方之間傳遞安全信息的表述性聲明規(guī)范。主要用于集群分布式中。
作用:可以做權(quán)限驗(yàn)證的使用,是一種標(biāo)準(zhǔn)化的數(shù)據(jù)傳輸規(guī)范,但是目的不是為了數(shù)據(jù)加密和保護(hù)。
使用場(chǎng)景
- 授權(quán):用于授權(quán)而并非是身份驗(yàn)證。通過(guò)身份驗(yàn)證,我們驗(yàn)證用戶(hù)的用戶(hù)名和密碼是否有效,并將用戶(hù)登錄到系統(tǒng)中,通過(guò)授權(quán),我們可以驗(yàn)證發(fā)送到服務(wù)器的請(qǐng)求是否屬于通過(guò)身份驗(yàn)證登錄的用戶(hù),從而可以授予該用戶(hù)訪問(wèn)系統(tǒng)的權(quán)限,繼而批準(zhǔn)該用戶(hù)使用獲取的token訪問(wèn)路由、服務(wù)和資源。
- 信息交換:json web token是在雙方之間安全地傳輸信息的一種好方法。因?yàn)閖wt可以被簽名,所以使您能夠確保發(fā)送方是他們聲稱(chēng)的那一方,由于簽名使用header和payload計(jì)算的,因此還使您能驗(yàn)證發(fā)送的內(nèi)容沒(méi)有被篡改。
對(duì)比token+redis
JWT就是Json Web Token,就是Token的典型方式。JWT和Token+Redis的區(qū)別,其實(shí)都是Token,只是JWT的可靠性保障是來(lái)源于加密算法(對(duì)稱(chēng)加密和非對(duì)稱(chēng)兩種),而Token+Redis的方案是依靠的后臺(tái)數(shù)據(jù)存儲(chǔ)。這兩個(gè)本質(zhì)也就帶來(lái)了使用上的區(qū)別:
1 JWT是去中心化的,不需要任何后臺(tái)數(shù)據(jù)的共享,第三方認(rèn)證、跨數(shù)據(jù)中心認(rèn)證、微服務(wù)等,都適合采用JWT的方式,當(dāng)然,因?yàn)槭侨ブ行幕?,不是?shí)時(shí)驗(yàn)證,所以本質(zhì)上來(lái)說(shuō)token的主動(dòng)過(guò)期是做不到的(要做到就會(huì)違背初衷)
2 Token+Redis是中心化的,要能識(shí)別token必須能訪問(wèn)該Redis,除非是有特別需求,要求每次token都實(shí)時(shí)檢測(cè),否則的話(huà)還是選擇JWT,畢竟是成熟通用的技術(shù),溝通維護(hù)成本也低,對(duì)開(kāi)發(fā)者也友好一些。
這點(diǎn)我忘記是摘錄哪個(gè)大佬的文章了,所以沒(méi)有給出引用地址很抱歉。
流程
用戶(hù)通過(guò)登錄去向服務(wù)系統(tǒng)發(fā)起請(qǐng)求,然后生成帶一定用戶(hù)信息的數(shù)據(jù)作為令牌(jwt)返回給用戶(hù),用戶(hù)拿到返回過(guò)來(lái)的信息在請(qǐng)求接口的時(shí)候放入頭部,服務(wù)系統(tǒng)會(huì)從頭部獲取到令牌后驗(yàn)證簽名的有效性,對(duì)客戶(hù)端做出相應(yīng)的響應(yīng)。
- Authorization: Bearer <token>
如果想在接口中獲取jwt令牌,可以使用
- var tokenHeader = HttpContext.Request.Headers["Authorization"].ToString().Replace("Bearer ", "");
現(xiàn)在感覺(jué)作用就是可以通過(guò)jwt實(shí)現(xiàn)權(quán)限,在系統(tǒng)中定義好有哪些權(quán)限,然后在方法頭部去設(shè)置哪些角色可以去訪問(wèn)這個(gè)東西。如果存放token,我的想法是把用戶(hù)的信息放到j(luò)wt內(nèi)部,然后前端通過(guò)登錄去獲取這東西,然后我返回這個(gè)東西到前臺(tái),每次調(diào)用接口時(shí)候把這個(gè)東西傳出過(guò)來(lái),然后我通過(guò)將這個(gè)解密獲取到我登錄時(shí)候存進(jìn)去的信息。然后進(jìn)行我自己的操作。
注意:
生成jwt時(shí)候的key必須在16位以上,否則會(huì)因?yàn)殚L(zhǎng)度不夠拋出異常
jwt本身是不加密的,里面包含的信息任何人都可以讀取到。
jwt的簽名部分是對(duì)前兩部分的簽名,防止數(shù)據(jù)被篡改,
Bearer認(rèn)證
Bearer認(rèn)證(也叫做令牌認(rèn)證)是一種HTTP認(rèn)證方案,其中包含的安全令牌的叫做Bearer Token。因此Bearer認(rèn)證的核心是Token。那如何確保Token的安全是重中之重。一種方式是使用Https,另一種方式就是對(duì)Token進(jìn)行加密簽名。而JWT就是一種比較流行的Token編碼方式。
驗(yàn)證
- //全局增加配置
- services.AddControllers((options) =>
- {
- options.Filters.Add(new AuthorizeFilter());//添加全局的Authorize
- });
- //控制器或者方法增加配置
- [Authorize]
原理
- 獲取token
- 第一步:對(duì)token進(jìn)行切割
- 第二步:對(duì)第二段解碼,獲取payload,檢測(cè)token是否超時(shí)
- 第三步:把前兩段拼接再次執(zhí)行HS256加密,把加密后的密文和第三段比較。如果相等,認(rèn)證通過(guò)
參考文檔
曉晨:https://www.cnblogs.com/stulzq/p/7417548.html
老張的哲學(xué):https://www.cnblogs.com/laozhang-is-phi/category/1413402.html