C# 生成校验解析token

  • 方式1
  • 方式3
  • 转载自 https://www.cnblogs.com/fanfan-90/p/12911203.html

重要对象

JwtSecurityToken:代表一个jwt token,可以直接用此对象生成token字符串,也可以使用token字符串创建此对象SecurityToken:JwtSecurityToken的基类,包含基础数据JwtSecurityTokenHandler:创建、校验token,返回ClaimsPrincipalCanReadToken():确定字符串是否是格式良好的Json Web令牌(JWT)ReadJwtToken(string token):token字符串转为JwtSecurityToken对象ValidateToken(string token、TokenValidationParameters parameter,out SecurityToken validatedToken):校验token,返回ClaimsIdentity,

方式1

引用NuGet包:System.IdentityModel.Tokens.Jwt

static void Main(string[] args){//引用System.IdentityModel.Tokens.JwtDateTime utcNow = DateTime.UtcNow;string key = "f47b558d-7654-458c-99f2-13b190ef0199";SecurityKey securityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(key));var claims = new List<Claim>() {new Claim("ID","1"),new Claim("Name","fan")};JwtSecurityToken jwtToken = new JwtSecurityToken(issuer: "fan",audience: "audi~~!",claims: claims,notBefore: utcNow,expires: utcNow.AddYears(1),signingCredentials: new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256));//生成token方式1string token1 = new JwtSecurityTokenHandler().WriteToken(jwtToken);//A Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor that contains details of contents of the token.var tokenDescriptor = new SecurityTokenDescriptor // 创建一个 Token 的原始对象{Issuer = "fan",Audience = "audi",Subject = new ClaimsIdentity(new[]{new Claim(ClaimTypes.Name, "")}),Expires = DateTime.Now.AddMinutes(60),SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(key)), SecurityAlgorithms.HmacSha256)};//生成token方式2SecurityToken securityToken = new JwtSecurityTokenHandler().CreateToken(tokenDescriptor);var token2 = new JwtSecurityTokenHandler().WriteToken(securityToken);//校验tokenvar validateParameter = new TokenValidationParameters(){ValidateLifetime = true,ValidateAudience = true,ValidateIssuer = true,ValidateIssuerSigningKey = true,ValidIssuer = "fan",ValidAudience = "audi~~!",IssuerSigningKey = securityKey,};//不校验,直接解析token//jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token1);try{//校验并解析tokenvar claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(token1, validateParameter, out SecurityToken validatedToken);//validatedToken:解密后的对象var jwtPayload = ((JwtSecurityToken)validatedToken).Payload.SerializeToJson(); //获取payload中的数据 }catch (SecurityTokenExpiredException){//表示过期}catch (SecurityTokenException){//表示token错误}}

##方式2
引用Nuget包:JWT

/// <summary>/// 创建token/// </summary>/// <returns></returns>public static string CreateJwtToken(IDictionary<string, object> payload, string secret, IDictionary<string, object> extraHeaders = null){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);return token;}/// <summary>/// 校验解析token/// </summary>/// <returns></returns>public static string ValidateJwtToken(string token, string secret){try{IJsonSerializer serializer = new JsonNetSerializer();IDateTimeProvider provider = new UtcDateTimeProvider();IJwtValidator validator = new JwtValidator(serializer, provider);IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();IJwtAlgorithm alg = new HMACSHA256Algorithm();IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, alg);var json = decoder.Decode(token, secret, true);//校验通过,返回解密后的字符串return json;}catch (TokenExpiredException){//表示过期return "expired";}catch (SignatureVerificationException){//表示验证不通过return "invalid";}catch (Exception){return "error";}}//-------------客户端调用---------------
public static void Main(string[] args){var sign = "123";var extraHeaders = new Dictionary<string, object>{{ "myName", "limaru" },};//过期时间(可以不设置,下面表示签名后 10秒过期)double exp = (DateTime.UtcNow.AddSeconds(10) - new DateTime(1970, 1, 1)).TotalSeconds;var payload = new Dictionary<string, object>{{ "userId", "001" },{ "userAccount", "fan" },{ "exp",exp }};var token = CreateJwtToken(payload, sign, extraHeaders);var text = ValidateJwtToken(token, sign);Console.ReadKey();}

方式3

手写jwt算法:

JWT组成样式:"xxxxxxxxxxxx.xxxxxxxxxxxxx.xxxxxxxxxxxxxxxx"由三部分组成.(1).Header头部:{\"alg\":\"HS256\",\"typ\":\"JWT\"}基本组成,也可以自己添加别的内容,然后对最后的内容进行Base64编码.(2).Payload负载:iss、sub、aud、exp、nbf、iat、jti基本参数,也可以自己添加别的内容,然后对最后的内容进行Base64编码.(3).Signature签名:将Base64后的Header和Payload通过.组合起来,然后利用Hmacsha256+密钥进行加密。#region Base64编码/// <summary>/// Base64编码/// </summary>/// <param name="text">待编码的文本字符串</param>/// <returns>编码的文本字符串</returns>public string Base64UrlEncode(string text){var plainTextBytes = Encoding.UTF8.GetBytes(text);var base64 = Convert.ToBase64String(plainTextBytes).Replace('+', '-').Replace('/', '_').TrimEnd('=');return base64;}#endregion#region Base64解码/// <summary>/// Base64解码/// </summary>       /// <param name="base64UrlStr"></param>/// <returns></returns>public string Base64UrlDecode(string base64UrlStr){base64UrlStr = base64UrlStr.Replace('-', '+').Replace('_', '/');switch (base64UrlStr.Length % 4){case 2:base64UrlStr += "==";break;case 3:base64UrlStr += "=";break;}var bytes = Convert.FromBase64String(base64UrlStr);return Encoding.UTF8.GetString(bytes);}
#endregion Base64编码和解码/// <summary>/// 手写JWT算法/// </summary>public bool TestJwt1(){string secretKey = Configuration["SecretKey"];//1.加密//1.1 表头的处理string headerBase64Url = this.Base64UrlEncode("{\"alg\":\"HS256\",\"typ\":\"JWT\"}");//1.2 PayLoad的处理var jwtPayLoad = new{expire = DateTime.Now.AddMinutes(15),userId = "00000000001",userAccount = "admin"};string payloadBase64Url = this.Base64UrlEncode(JsonConvert.SerializeObject(jwtPayLoad));//1.3 Sign的处理string sign = $"{headerBase64Url}.{payloadBase64Url}".HMACSHA256(secretKey);//1.4 最终的jwt字符串string jwtStr = $"{headerBase64Url}.{payloadBase64Url}.{sign}";//2.校验token是否正确bool result;   //True表示通过,False表示未通过//2.1. 获取token中的PayLoad中的值,并做过期校验JwtData myData = JsonConvert.DeserializeObject<JwtData>(this.Base64UrlDecode(jwtStr.Split('.')[1]));  //这一步已经获取到了payload中的值,并进行转换了var nowTime = DateTime.Now;if (nowTime > myData.expire){//表示token过期,校验未通过result = false;return result;}else{//2.2 做准确性校验var items = jwtStr.Split('.');var oldSign = items[2];string newSign = $"{items[0]}.{items[1]}".HMACSHA256(secretKey);result = oldSign == newSign;  //true表示检验通过,false表示检验未通过return result;}}

转载自 https://www.cnblogs.com/fanfan-90/p/12911203.html

C# 生成校验解析token相关推荐

  1. Java Token登录验证 使用jjwt生成和解析JWT

    Java jjwt生成和解析Token 参考 依赖 流程 生成和解析Jwt 生成jwt 解析Jwt 实例 后端 前端 刚学会了点使用Jwt来验证登录,记录下来 参考 JSON Web Tokens官网 ...

  2. TokenUtil工具类(生成token和解析token)

    TokenUtil public class TokenUtil {/*** 生成token*/public static String createToken(String username, Bo ...

  3. jwt生成token与解析token

    1.生成token与解析token部分代码 pom <!-- token验证 --><dependency><groupId>com.auth0</group ...

  4. java token生成和验证_Java Token登录验证 生成解析Token

    借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...

  5. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  6. JWT 生成Token、解析Token的简单工具类

    pom.xml导入依赖: <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt& ...

  7. JWT —— 生成Token、解析Token的简单工具类

    目录 1.JWT介绍 2.导入依赖 3.用户类 4.JWT工具类 背景:最近需要实现根据账号密码生成令牌码的功能,token解析后需要得到用户id.用户账号和用户类型.实现起来并不难,解决方法就是在J ...

  8. 西瓜视频官方缩短域名网址接口v.ixigua.com生成原理解析

    西瓜视频官方缩短网址域名接口https://v.ixigua.com/xxxx生成原理解析需要接入西瓜数据开放平台开发,开发者需要按照如下步骤完成: 发送规范请求 验证校验码有效性 依据接口文档实现业 ...

  9. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

最新文章

  1. 【转载】Role of RL in Text Generation by GAN
  2. 两台xenserver 同一个vlan中的vm 不能ping通?
  3. python的数据类型和变量的定义及使用
  4. oracle数据库教程-张晨光-专题视频课程
  5. SAP Fiori 页面的周期性动态刷新功能的实现步骤
  6. python查找指定字符所在行号_python查找字符串中某个字符
  7. 《计算机应用基础》18春作业,【北语网院】18春《计算机应用基础》作业_4.pdf...
  8. 腾讯这套SpringMVC面试题你懂多少(面试题和答案)
  9. 计算机组成原理中的直接映像,计算机组成原理cache存储器的直接映像与变换.doc...
  10. [ural1297]Palindrome
  11. 一文整理常见Java后端面试题系列——Kafka篇(2022最新版)
  12. 了解掌握Java的循环语句、条件语句、分支语句(Java 从自学到就业 第3天)
  13. pycharm 破解方法
  14. 视频教程-规范毕业论文及精美简历排版实战-Office/WPS
  15. win7环境下visualsvn-server的搭建与使用(Eclipse)整合版
  16. 联发科发布全新旗舰5G芯片;全球半数雇主计划加薪并恢复至正常招聘水平 | 美通企业日报...
  17. 前有天猫生鲜和易果生鲜 系出阿里“同门”的盒马鲜生要怎么走?
  18. 解决“VirtualBox VERR_NEM_INIT_FAILED“问题
  19. 抑郁检测用文本数据集
  20. [ZT]从购房到装修完毕的整个流程

热门文章

  1. JUC-不得不说的Java“锁”事
  2. 10月29日晚8点,国产开源物联网操作系统TencentOS tiny线上直播开讲
  3. 上万元的显卡,说烧就烧:亚马逊《新世界》内测首日,出现多起RTX 3090变砖事故
  4. 宝塔docker+centos8无法安装apache
  5. Conference Paper和Conference Proceeding的区别
  6. manecher算法 最长回文子字符串
  7. 水果店5块钱随便拿?只用7天就成交3000多个会员,实用方案!
  8. 【http学习笔记一】破冰篇
  9. Spark开发注意: collect_list、collect_set会去除Null值
  10. 企业数字营销的内容创意之痛,利用SaaS工具致胜