码迷,mamicode.com
首页 > Web开发 > 详细

关于JWT.NET

时间:2018-09-07 19:16:26      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:tde   dict   程序   解密   目的   bubuko   try   传递   输入   

1.JWT的概念:
JWT全称是Json Web Token,是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

2.JWT的结构
JWT一般由三段构成,用.号分隔开,第一段是header,第二段是payload,第三段是signature,例如:

技术分享图片

header(jwt的头部)承载两部分信息就像JSON:
声明类型。这里是jwt
  声明加密的算法。通常直接使用 HMAC SHA256,其它还有RS256等

技术分享图片

playload 载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分:
标准中注册的声明
  公共的声明
  私有的声明
标准中注册的声明 (建议但不强制使用) :
iss : jwt签发者
sub:jwt所面向的用户
aud:接收jwt的一方
exp:jwt的过期时间,这个过期时间必须要大于签发时间
nbf:定义在什么时间之前,该jwt都是不可用的.
iat :jwt的签发时间
jti :jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密

私有的声明 :
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息

定义一个playload
技术分享图片

signature jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload (base64后的)
secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加secret组合加密,然后就构成了jwt的第三部分
技术分享图片

如何应用
一般是在请求头里加入Authorization,并加上Bearer标注:
技术分享图片

在项目的程序包管理器控制台 ,输入以下:
Install-Package JWT -Version 3.0.0
安装JWT.NET 3.0.0

        static void Main(string[] args)
        {
            IDateTimeProvider provider = new UtcDateTimeProvider();

            var now = provider.GetNow();

            var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            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);

            string secret = "123";//密钥
            var token = encoder.Encode(payload, secret);
            Console.WriteLine(token);

            Decrypt(token,secret);


            Console.ReadKey();

        }

        /// <summary>
        ///  解密
        /// </summary>
        /// <param name="token">token信息</param>
        /// <param name="secret">密钥</param>
        private static void Decrypt(string token,string secret)
        {
            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");
            }
        }

关于JWT.NET

标签:tde   dict   程序   解密   目的   bubuko   try   传递   输入   

原文地址:https://www.cnblogs.com/ButterflyEffect/p/9606509.html

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