namespace TokenTest
{
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text; //Install-Package System.IdentityModel.Tokens.Jwt
public enum JwtHashAlgorithm
{
RS256,
HS384,
HS512
} public class JsonWebToken
{
private static Dictionary<JwtHashAlgorithm, Func<byte[], byte[], byte[]>> HashAlgorithms; static JsonWebToken()
{
HashAlgorithms = new Dictionary<JwtHashAlgorithm, Func<byte[], byte[], byte[]>>
{
{ JwtHashAlgorithm.RS256, (key, value) => { using (var sha = new HMACSHA256(key)) { return sha.ComputeHash(value); } } },
{ JwtHashAlgorithm.HS384, (key, value) => { using (var sha = new HMACSHA384(key)) { return sha.ComputeHash(value); } } },
{ JwtHashAlgorithm.HS512, (key, value) => { using (var sha = new HMACSHA512(key)) { return sha.ComputeHash(value); } } }
};
} public static string Encode(object payload, string key, JwtHashAlgorithm algorithm)
{
return Encode(payload, Encoding.UTF8.GetBytes(key), algorithm);
} public static string Encode(object payload, byte[] keyBytes, JwtHashAlgorithm algorithm)
{
var segments = new List<string>();
var header = new { alg = algorithm.ToString(), typ = "JWT" }; byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header, Formatting.None));
byte[] payloadBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None));
//byte[] payloadBytes = Encoding.UTF8.GetBytes(@"{"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com","scope":"https://www.googleapis.com/auth/prediction","aud":"https://accounts.google.com/o/oauth2/token","exp":1328554385,"iat":1328550785}"); segments.Add(Base64UrlEncode(headerBytes));
segments.Add(Base64UrlEncode(payloadBytes)); var stringToSign = string.Join(".", segments.ToArray()); var bytesToSign = Encoding.UTF8.GetBytes(stringToSign); byte[] signature = HashAlgorithms[algorithm](keyBytes, bytesToSign);
segments.Add(Base64UrlEncode(signature)); return string.Join(".", segments.ToArray());
} public static object Decode(string token, string key)
{
return Decode(token, key, true);
} public static object Decode(string token, string key, bool verify)
{
var parts = token.Split('.');
var header = parts[];
var payload = parts[];
byte[] crypto = Base64UrlDecode(parts[]); var headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header));
var headerData = JObject.Parse(headerJson);
var payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload));
var payloadData = JObject.Parse(payloadJson); if (verify)
{
var bytesToSign = Encoding.UTF8.GetBytes(string.Concat(header, ".", payload));
var keyBytes = Encoding.UTF8.GetBytes(key);
var algorithm = (string)headerData["alg"]; var signature = HashAlgorithms[GetHashAlgorithm(algorithm)](keyBytes, bytesToSign);
var decodedCrypto = Convert.ToBase64String(crypto);
var decodedSignature = Convert.ToBase64String(signature); if (decodedCrypto != decodedSignature)
{
throw new ApplicationException(string.Format("Invalid signature. Expected {0} got {1}", decodedCrypto, decodedSignature));
}
} //return payloadData.ToString();
return payloadData;
} private static JwtHashAlgorithm GetHashAlgorithm(string algorithm)
{
switch (algorithm)
{
case "RS256": return JwtHashAlgorithm.RS256;
case "HS384": return JwtHashAlgorithm.HS384;
case "HS512": return JwtHashAlgorithm.HS512;
default: throw new InvalidOperationException("Algorithm not supported.");
}
} // from JWT spec
private static string Base64UrlEncode(byte[] input)
{
var output = Convert.ToBase64String(input);
output = output.Split('=')[]; // Remove any trailing '='s
output = output.Replace('+', '-'); // 62nd char of encoding
output = output.Replace('/', '_'); // 63rd char of encoding
return output;
} // from JWT spec
private static byte[] Base64UrlDecode(string input)
{
var output = input;
output = output.Replace('-', '+'); // 62nd char of encoding
output = output.Replace('_', '/'); // 63rd char of encoding
switch (output.Length % ) // Pad with trailing '='s
{
case : break; // No pad chars in this case
case : output += "=="; break; // Two pad chars
case : output += "="; break; // One pad char
default: throw new System.Exception("Illegal base64url string!");
}
var converted = Convert.FromBase64String(output); // Standard base64 decoder
return converted;
}
} }

调用:

 var obj = new { Name="Gavin", Age=, Email="gavin@abc.com"};
            var key = "SevenStarKey";
            var token = JsonWebToken.Encode(obj, key, JwtHashAlgorithm.HS512);
            var objStr = JsonWebToken.Decode(token, key);

来自:https://blog.csdn.net/ma_jiang/article/details/53320367

最新文章

  1. Struts2 JSON
  2. jQuery 复习
  3. CSS 属性 - 伪类和伪元素的区别
  4. linux下IPTABLES配置详解
  5. ZOJ 2404 Going Home 【最小费用最大流】
  6. div 绝对布局居中
  7. 基于C#实现的HOOK键盘钩子实例代码
  8. C++ STL之迭代器注意事项
  9. [mock]12月28日
  10. JavaScript实现回车键切换输入框焦点
  11. 【贪心+中位数】【新生赛3 1007题】 Problem G (K)
  12. ubuntu解压乱码
  13. Codeforces Round #326 (Div. 2) B
  14. 配置Nginx部署静态资源和自动跳转到https
  15. 求逆序对常用的两种算法 ----归并排 &amp; 树状数组
  16. Postman 中上传图片的接口怎么做参数化呢?
  17. selenium启动谷歌浏览器
  18. 搜索jar包 出现很多 Artifact Id相同 但Group Id不同 的包
  19. halcon 动态阈值分割之偏移值
  20. 动态分配内存 new

热门文章

  1. vue里的样式添加之行间样式
  2. td使用word-break: break-all;强制换行无效的解决
  3. mysql提权常用方法。 hack某某
  4. AVL树C++实现(插入,删除,查找,清空,遍历操作)
  5. 最全的MonkeyRunner自动化测试从入门到精通(7)
  6. SQL 查询嵌套使用
  7. 转载:Linux下解压zip乱码问题的解决(unzip)
  8. @Value(&quot;${xxxx}&quot;)注解的配置及使用
  9. [js]js中变量带var和不带var的区别
  10. [LeetCode] 90.Subsets II tag: backtracking