zoukankan      html  css  js  c++  java
  • 关于JWT.NET

    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");
                }
            }
    
    
  • 相关阅读:
    layui iframe版点击左侧菜单栏实现加载等待动画
    概率论基础内容
    fatal error LNK1123:转换COFF期间失败:文件无效或损坏
    ERROR 2003:Can't connect to MySQL server on ‘localhost’...
    HttpWebRequest 无法连接到远程服务器
    Android Error: java.lang.IllegalStateException: Could not execute method of the activity
    创建.aspx页面
    CodeFile Inherits
    Unable to execute dex:Target out of range
    fatal error C1083: 无法打开包括文件“jni.h”
  • 原文地址:https://www.cnblogs.com/ButterflyEffect/p/9606509.html
Copyright © 2011-2022 走看看