码迷,mamicode.com
首页 > 其他好文 > 详细

JWt的简单应用

时间:2017-11-26 12:47:01      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:encode   net   now()   lin   invalid   jpg   acs   cio   应用   

JWT 由三块组成,可以把用户名、用户 Id 等保存到 Payload 部分

技术分享图片

 注意 Payload和 Header部分都是 Base64编码,可以轻松的 Base64解码回来。因此 Payload 部分约等于是明文的,因此不能在 Payload 中保存不能让别人看到的机密信息。虽然说 Payload 部分约等于是明文的,但是不用担心 Payload 被篡改,因为 Signature 部分是根据 header+payload+secretKey 进行加密算出来的,如果 Payload 被篡改,就可以根据 Signature 解密时候校验。

1.加密

Install-Package JWT  //需要.net 4.6.2,旧版要求低

var payload = new Dictionary<string, object>

{

         { "UserId", 123 },

         { "UserName", "admin" }

};

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.解密

var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qj w1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U"; 
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"); }

 试着篡改一下 Payload 部分。

3.添加过期时间,过期时间即这个时间之后JWT不接受处理,时间的有效值为某一时刻和1970/1/1 00:00:00 相差的秒数

下面的例子是当前时间到1970/1/1 00:00:00 的秒数,即过期时间为当前时间。如果设置为当前时间+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

 

JWt的简单应用

标签:encode   net   now()   lin   invalid   jpg   acs   cio   应用   

原文地址:http://www.cnblogs.com/shx666/p/7898492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!