一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 基于JWT.NET的使用(詳解)

基于JWT.NET的使用(詳解)

2022-02-16 15:16MrBug C#

下面小編就為大家分享一篇基于JWT.NET的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

jwt是什么

jwt全稱是json web token,是一種用于雙方之間傳遞安全信息的簡潔的、url安全的表述性聲明規(guī)范。jwt作為一個開放的標準( rfc 7519 ),定義了一種簡潔的,自包含的方法用于通信雙方之間以json對象的形式安全的傳遞信息。因為數(shù)字簽名的存在,這些信息是可信的,jwt可以使用hmac算法或者是rsa的公私秘鑰對進行簽名。

jwt的結構

jwt一般由三段構成,用.號分隔開,第一段是header,第二段是payload,第三段是signature,例如:

?
1
eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjuyw1lijoitxjcdwcilcjlehaioje1mti5ntkzmdmumcwianrpijoibhvvemhpcgvuzyj9.9iwgmhms0mophyfglilk15hs_ee770ichaz-bwcx5c0

1、header

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

聲明類型。這里是jwt

聲明加密的算法。通常直接使用 hmac sha256,其它還有rs256等

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

?
1
2
3
4
{
"alg": "hs256",
"typ": "jwt"
}

然后將頭部進行base64加密(該加密是可以對稱解密的),構成了第一部分

?
1
eyj0exaioijkv1qilcjhbgcioijiuzi1nij9

2、playload

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

標準中注冊的聲明

公共的聲明

私有的聲明

標準中注冊的聲明 (建議但不強制使用) :

iss : jwt簽發(fā)者

sub:jwt所面向的用戶

aud:接收jwt的一方

exp:jwt的過期時間,這個過期時間必須要大于簽發(fā)時間

nbf:定義在什么時間之前,該jwt都是不可用的.

iat :jwt的簽發(fā)時間

jti :jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。

公共的聲明 :

公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業(yè)務需要的必要信息.但不建議添加敏感信息,因為該部分在客戶端可解密.

私有的聲明 :

私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息。

定義一個playload

?
1
2
3
4
5
{
 "name": "mrbug",
 "exp": 1512959303,
 "jti": "luozhipeng"
}

然后將其進行base64加密,得到jwt的第二部分

?
1
eyjuyw1lijoitxjcdwcilcjlehaioje1mti5ntkzmdmumcwianrpijoibhvvemhpcgvuzyj9

3、signature

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

header (base64后的)

payload (base64后的)

secret

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

?
1
2
3
4
<span style="color: #008000">//</span><span style="color: #008000"> javascript</span>
<span style="color: #0000ff">var</span> encodedstring = base64urlencode(header) + '.' +<span style="color: #000000"> base64urlencode(payload);
 
</span><span style="color: #0000ff">var</span> signature = hmacsha256(encodedstring, 'secret'); <span style="color: #008000">//</span><span style="color: #008000"> 9iwgmhms0mophyfglilk15hs_ee770ichaz-bwcx5c0</span>

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

?
1
eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjuyw1lijoitxjcdwcilcjlehaioje1mti5ntkzmdmumcwianrpijoibhvvemhpcgvuzyj9.9iwgmhms0mophyfglilk15hs_ee770ichaz-bwcx5c0

注意:secret是保存在服務器端的,jwt的簽發(fā)生成也是在服務器端的,secret就是用來進行jwt的簽發(fā)和jwt的驗證,所以,它就是你服務端的私鑰,在任何場景都不應該流露出去。一旦客戶端得知這個secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。

如何應用

一般是在請求頭里加入authorization,并加上bearer標注:

?
1
2
3
4
5
fetch('api/user/1', {
 headers: {
 'authorization': 'bearer ' + token
 }
})

服務端會驗證token,如果驗證通過就會返回相應的資源。整個流程就是這樣的:

基于JWT.NET的使用(詳解)

安全相關

不應該在jwt的payload部分存放敏感信息,因為該部分是客戶端可解密的部分。

保護好secret私鑰,該私鑰非常重要。

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

如何在.net中使用

這里要用到一個jwt.net的第三方庫,可以通過nuget的方式獲取,目前最新版是3.1.1,最新版只支持.net framework4.6及以上,如圖

基于JWT.NET的使用(詳解)

因為,我項目中用的是.net framework4.5,所以我安裝的是jwt.net 3.0.0,你可以使用vs 工具 / nuget包管理器 / 程序包管理器控制臺 ,輸入以下命令手動安裝

?
1
install-package jwt -version 3.0.0

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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解密

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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接口

?
1
2
3
4
5
6
7
8
9
10
11
public class customjsonserializer : ijsonserializer
{
  public string serialize(object obj)
  {
    // implement using favorite json serializer
  }
  public t deserialize&lt;t>(string json)
  {
    // implement using favorite json serializer
  }
}

使用

?
1
2
3
4
ijwtalgorithm algorithm = new hmacsha256algorithm();
ijsonserializer serializer = new customjsonserializer();
ibase64urlencoder urlencoder = new jwtbase64urlencoder();
ijwtencoder encoder = new jwtencoder(algorithm, serializer, urlencoder);

4、自定義json序列化

默認的json序列化由jsonnetserializer完成,可以自定義序列化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
jsonserializer customjsonserializer = new jsonserializer
{
  // all json keys start with lowercase characters instead of the exact casing of the model/property. e.g. fullname
  contractresolver = 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);

以上這篇基于jwt.net的使用(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/mrbug/archive/2017/12/11/8022826.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本大片在线 | 99热精品国产麻豆 | 午夜宅男网 | 免费看片aⅴ免费大片 | 亚洲乱码一二三四区国产 | 风间由美一区二区播放合集 | 星空无限传媒视频在线观看视频 | 欧美亚洲一区二区三区在线 | 处女摘花 | 精品suv一区二区三区 | 日韩一级欧美一级一级国产 | 亚洲精品第一国产综合 | 精品AV综合导航 | 天天插在线视频 | 四虎影院免费视频 | 精品国产乱码久久久久久人妻 | 15同性同志18 | 91se在线| 色综合天天五月色 | 天天色综合久久 | 色视频综合 | 第一次出血videos | 四大美女思春艳史片 | 国内精品伊人久久大香线焦 | 亚洲爆操| 毛片在线免费视频 | nxgx国产| 国产一卡二卡四卡免费 | 亚洲精品卡一卡2卡3卡4卡 | 欧美贵妇vs高跟办公室 | 亚洲激情欧美 | 国产精品酒店视频免费看 | 欧美性白人顶级hd | 男人天堂新| 国产午夜亚洲精品理论片不卡 | 免费一级夫妻a | 狠狠干2016| 三级全黄的视频 | 成人精品mv视频在线观看 | 国产一区二区三区久久精品小说 | 四虎影视库永久在线地址 |