JWT.net 操作實(shí)踐方法
1.JWT定義
JWT(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)行簽名。
2.JWT的組成部分
(1)JWT一般由三段構(gòu)成,用.號(hào)分隔開(kāi),第一段是header,第二段是payload,第三段是signature,
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
3.Jwt.Net 使用
首先,需要先引入Jwt.Net,可通過(guò)nuget的方式添加:Install-Package JWT -Version 2.4.2(自己選擇合適的版本)
(1)創(chuàng)建token,此處,我們只需要自定義payload和secrect密鑰即可,可生成三段格式的字符串
var payload = new Dictionary<string, object> { { "claim1", 0 }, { "claim2", "claim2-value" } }; var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; 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解密,可看到輸出為{ "claim1": 0, "claim2": "claim2-value" },可以用json["claim1"],json["claim2"]的方式獲取各個(gè)值,此處json為IDictionary<string,object>類型token解密,可看到輸出為{ "claim1": 0, "claim2": "claim2-value" },可以用json["claim1"],json["claim2"]的方式獲取各個(gè)值,此處json為IDictionary<string,object>類型
var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGFpbTEiOjAsImNsYWltMiI6ImNsYWltMi12YWx1ZSJ9.8pwBI_HtXqI3UgQHQ_rDRnSQRxFL1SR8fbQoS-5kM5s"; var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; 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); Console.WriteLine(json); } catch (TokenExpiredException) { Console.WriteLine("Token has expired"); } catch (SignatureVerificationException) { Console.WriteLine("Token has invalid signature"); }
(3)添加過(guò)期時(shí)間,過(guò)期時(shí)間即這個(gè)時(shí)間之后JWT不接受處理,時(shí)間的有效值為某一時(shí)刻和1970/1/1 00:00:00 相差的秒數(shù)
下面的例子是當(dāng)前時(shí)間到1970/1/1 00:00:00 的秒數(shù),即過(guò)期時(shí)間為當(dāng)前時(shí)間。如果設(shè)置為當(dāng)前時(shí)間+10秒,可添加secondsSinceEpoch=secondsSinceEpoch+10
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> { { "exp", secondsSinceEpoch } }; var secret = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; var token = encoder.Encode(payload, secret); var json = decoder.Decode(token, secret); // TokenExpiredException
(4)也可自定義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);
以上這篇JWT.net 操作實(shí)踐方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在WinForm應(yīng)用程序中快速實(shí)現(xiàn)多語(yǔ)言的處理的方法
在國(guó)際化環(huán)境下,越來(lái)越多的程序需要做多語(yǔ)言版本,這篇文章主要介紹了在WinForm應(yīng)用程序中快速實(shí)現(xiàn)多語(yǔ)言的處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2018-07-07c# 通過(guò)經(jīng)緯度查詢 具體的地址和區(qū)域名稱
最近項(xiàng)目需要通過(guò)經(jīng)緯度查詢 具體的地址和區(qū)域名稱,通過(guò)查詢網(wǎng)絡(luò)資源,發(fā)現(xiàn)提供的大多是得到具體的地址而對(duì)區(qū)域或城市名稱的獲取就不是很好把握;在這里自己搞了個(gè),需要的朋友可以參考下2012-11-11C#調(diào)用QQ_Mail發(fā)送郵件實(shí)例代碼兩例
這篇文章介紹了C#調(diào)用QQ_Mail發(fā)送郵件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#中OpenCvSharp 通過(guò)特征點(diǎn)匹配圖片的方法
這篇文章主要介紹了OpenCvSharp 通過(guò)特征點(diǎn)匹配圖片的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09c#中winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實(shí)現(xiàn)
本文主要介紹了c#winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#生成單頁(yè)靜態(tài)頁(yè)簡(jiǎn)單實(shí)例
這篇文章主要介紹了C#生成單頁(yè)靜態(tài)頁(yè)簡(jiǎn)單實(shí)例,是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10DirectoryInfo引用一個(gè)相對(duì)目錄的實(shí)例
這種特殊參數(shù)在Windows的命令提示符或者“運(yùn)行”對(duì)話框中都可以使用,等價(jià)于DOS中的cd命令參數(shù)。直接上代碼,一看你就懂了:2013-04-04