日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

JWT.NET的使用

發(fā)布時(shí)間:2025/3/15 asp.net 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JWT.NET的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JWT.NET的使用 原文:JWT.NET的使用

JWT是什么

JWT全稱(chēng)是Json Web Token,是一種用于雙方之間傳遞安全信息的簡(jiǎn)潔的、URL安全的表述性聲明規(guī)范。JWT作為一個(gè)開(kāi)放的標(biāo)準(zhǔn)( RFC 7519 ),定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以Json對(duì)象的形式安全的傳遞信息。因?yàn)閿?shù)字簽名的存在,這些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘鑰對(duì)進(jìn)行簽名。

?

JWT的結(jié)構(gòu)

JWT一般由三段構(gòu)成,用.號(hào)分隔開(kāi),第一段是header,第二段是payload,第三段是signature,例如:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiTXJCdWciLCJleHAiOjE1MTI5NTkzMDMuMCwianRpIjoibHVvemhpcGVuZyJ9.9iwGMHmS0mophyFgliLK15hs_eE770IchaZ-bWcX5c0

?

1、header

jwt的頭部承載兩部分信息:

  聲明類(lèi)型。這里是jwt
  聲明加密的算法。通常直接使用 HMAC SHA256,其它還有RS256等

完整的頭部就像下面這樣的JSON:

{"alg": "HS256","typ": "JWT" }

?然后將頭部進(jìn)行base64加密(該加密是可以對(duì)稱(chēng)解密的),構(gòu)成了第一部分

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

?

2、playload

載荷就是存放有效信息的地方。這個(gè)名字像是特指飛機(jī)上承載的貨品,這些有效信息包含三個(gè)部分:

  標(biāo)準(zhǔn)中注冊(cè)的聲明
  公共的聲明
  私有的聲明

標(biāo)準(zhǔn)中注冊(cè)的聲明 (建議但不強(qiáng)制使用) :

??? iss : jwt簽發(fā)者
??? sub:jwt所面向的用戶(hù)
??? aud:接收jwt的一方
??? exp:jwt的過(guò)期時(shí)間,這個(gè)過(guò)期時(shí)間必須要大于簽發(fā)時(shí)間
??? nbf:定義在什么時(shí)間之前,該jwt都是不可用的.
??? iat :jwt的簽發(fā)時(shí)間
??? jti? :jwt的唯一身份標(biāo)識(shí),主要用來(lái)作為一次性token,從而回避重放攻擊。

?

公共的聲明 :
公共的聲明可以添加任何的信息,一般添加用戶(hù)的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.但不建議添加敏感信息,因?yàn)樵摬糠衷诳蛻?hù)端可解密.

私有的聲明 :
私有聲明是提供者和消費(fèi)者所共同定義的聲明,一般不建議存放敏感信息,因?yàn)閎ase64是對(duì)稱(chēng)解密的,意味著該部分信息可以歸類(lèi)為明文信息。

定義一個(gè)playload

{"name": "MrBug","exp": 1512959303,"jti": "luozhipeng" }

?然后將其進(jìn)行base64加密,得到Jwt的第二部分

eyJuYW1lIjoiTXJCdWciLCJleHAiOjE1MTI5NTkzMDMuMCwianRpIjoibHVvemhpcGVuZyJ9

?

3、signature

jwt的第三部分是一個(gè)簽證信息,這個(gè)簽證信息由三部分組成:

??? header (base64后的)
??? payload (base64后的)
??? secret

這個(gè)部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過(guò)header中聲明的加密方式進(jìn)行加secret組合加密,然后就構(gòu)成了jwt的第三部分。

// javascript var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, 'secret'); // 9iwGMHmS0mophyFgliLK15hs_eE770IchaZ-bWcX5c0

將這三部分用.連接成一個(gè)完整的字符串,構(gòu)成了最終的jwt:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiTXJCdWciLCJleHAiOjE1MTI5NTkzMDMuMCwianRpIjoibHVvemhpcGVuZyJ9.9iwGMHmS0mophyFgliLK15hs_eE770IchaZ-bWcX5c0

?
注意:secret是保存在服務(wù)器端的,jwt的簽發(fā)生成也是在服務(wù)器端的,secret就是用來(lái)進(jìn)行jwt的簽發(fā)和jwt的驗(yàn)證,所以,它就是你服務(wù)端的私鑰,在任何場(chǎng)景都不應(yīng)該流露出去。一旦客戶(hù)端得知這個(gè)secret, 那就意味著客戶(hù)端是可以自我簽發(fā)jwt了。

?

如何應(yīng)用

一般是在請(qǐng)求頭里加入Authorization,并加上Bearer標(biāo)注:

fetch('api/user/1', {headers: {'Authorization': 'Bearer ' + token} })

?

服務(wù)端會(huì)驗(yàn)證token,如果驗(yàn)證通過(guò)就會(huì)返回相應(yīng)的資源。整個(gè)流程就是這樣的:


?

安全相關(guān)

不應(yīng)該在jwt的payload部分存放敏感信息,因?yàn)樵摬糠质强蛻?hù)端可解密的部分。

保護(hù)好secret私鑰,該私鑰非常重要。

如果可以,請(qǐng)使用https協(xié)議

如何在.net中使用

這里要用到一個(gè)JWT.NET的第三方庫(kù),可以通過(guò)NuGet的方式獲取,目前最新版是3.1.1,最新版只支持.net framework4.6及以上,如圖

因?yàn)?#xff0c;我項(xiàng)目中用的是.net framework4.5,所以我安裝的是JWT.NET 3.0.0,你可以使用VS 工具 /? NuGet包管理器 / 程序包管理器控制臺(tái) ,輸入以下命令手動(dòng)安裝

Install-Package JWT -Version 3.0.0

?

?

1、創(chuàng)建token,此處,我們只需要自定義payload和secrect密鑰即可,可生成三段格式的字符串

IDateTimeProvider provider = new UtcDateTimeProvider(); var now = provider.GetNow();var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // or use JwtValidator.UnixEpoch var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds);var payload = new Dictionary<string, object> {{ "name", "MrBug" }, {"exp",secondsSinceEpoch+100 },{"jti","luozhipeng" } };Console.WriteLine(secondsSinceEpoch);IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new JsonNetSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);var token = encoder.Encode(payload, secret); Console.WriteLine(token);

?

?

?2、token解密

try {IJsonSerializer serializer = new JsonNetSerializer();IDateTimeProvider provider = new UtcDateTimeProvider();IJwtValidator validator = new JwtValidator(serializer, provider);IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);var json = decoder.Decode(token, secret, verify: true);//token為之前生成的字符串Console.WriteLine(json); } catch (TokenExpiredException) {Console.WriteLine("Token has expired"); } catch (SignatureVerificationException) {Console.WriteLine("Token has invalid signature"); }

?

?

3、自定義json解析器,只要繼承IJsonSerializer接口

public class CustomJsonSerializer : IJsonSerializer {public string Serialize(object obj){// Implement using favorite JSON Serializer }public T Deserialize<T>(string json){// Implement using favorite JSON Serializer } }

?

使用

IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new CustomJsonSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

?

?

4、自定義JSON序列化

默認(rèn)的JSON序列化由JsonNetSerializer完成,可以自定義序列化:

JsonSerializer customJsonSerializer = new JsonSerializer {// All json keys start with lowercase characters instead of the exact casing of the model/property. e.g. fullNameContractResolver = new CamelCasePropertyNamesContractResolver(), // Nice and easy to read, but you can also do Formatting.None to reduce the payload size (by hardly anything...)Formatting = Formatting.Indented,// The best date/time format/standard.DateFormatHandling = DateFormatHandling.IsoDateFormat,// Don't add key/values when the value is null.NullValueHandling = NullValueHandling.Ignore,// Use the enum string-value, not the implicit int value, e.g. "oolor" : "red"Converters.Add(new StringEnumConverter()) }; IJsonSerializer serializer = new JsonNetSerializer(customJsonSerializer);

?

?

?

整理自:

https://github.com/jwt-dotnet/jwt

http://www.jianshu.com/p/576dbf44b2ae

?

posted on 2017-12-12 01:21 NET未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/8025822.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的JWT.NET的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。