.NET JWT 的基本使用


theme: condensed-night-purple

安装依赖

Microsoft.IdentityModel.Token.JWT

image.png

生成Jwt

image.png

``` using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text;

List claims = new List ();

claims.Add(new Claim("Passport", "123")); claims.Add(new Claim("QQ", "666")); claims.Add(new Claim("UserId", "888")); claims.Add(new Claim(ClaimTypes.Name, "zhansan")); claims.Add(new Claim(ClaimTypes.Role, "admin")); claims.Add(new Claim(ClaimTypes.Role, "maneger"));

string key = "mykey123#$$(mykey123#$$(mykey123#$$(mykey123#$$("; DateTime expire = DateTime.Now.AddDays(1);

byte[] bytes = Encoding.UTF8.GetBytes(key); SymmetricSecurityKey secKey = new SymmetricSecurityKey(bytes); SigningCredentials credentials = new(secKey, SecurityAlgorithms.HmacSha256Signature); JwtSecurityToken tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expire, signingCredentials: credentials); string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);

Console.WriteLine(jwt);

```

取出JWT内容

负载中的内容是以明文形式存储的

不要把不能被客户端知道的信息放到JWT

image.png

``` using System.Text;

string jwt = "eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJQYXNzcG9ydCI6IjEyMyIsIlFRIjoiNjY2IiwiVXNlcklkIjoiODg4IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InpoYW5zYW4iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiYWRtaW4iLCJtYW5lZ2VyIl0sImV4cCI6MTY5MjAxNjQzN30.N3OV8EvZD7llZokiO7l7E3iID1hBfzY1wN2gFA2Tcig"; string[] strs = jwt.Split('.');

string header = strs[0]; string payload = strs[1]; string sign = strs[2];

Console.WriteLine(JwtDecode(header)); Console.WriteLine(JwtDecode(payload)); Console.WriteLine(JwtDecode(sign));

string JwtDecode(string s) { s = s.Replace("-", "+").Replace("_", "/"); switch (s.Length % 4) { case 2: s += "=="; break; case 3: s += "="; break; } byte[] bytes = Convert.FromBase64String(s); return Encoding.UTF8.GetString(bytes); }

```

优化

JWT

原JWT:

eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJQYXNzcG9ydCI6IjEyMyIsIlFRIjoiNjY2IiwiVXNlcklkIjoiODg4IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InpoYW5zYW4iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiYWRtaW4iLCJtYW5lZ2VyIl0sImV4cCI6MTY5MjAxOTYwNH0.HZgwDSI-gw2FuHjVpJqYj45wQK04KA46OLNnc9QaOPM

篡改后JWT:

eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJQYXNzcG9ydCI6IjEyMyIsIlFRIjoiNjY2IiwiVXNlcklkIjoiODg4IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6Imxpc2kiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiYWRtaW4iLCJtYW5lZ2VyIl0sImV4cCI6MTY5MjAxOTYzMX0.1pqp6UoRQpQo3kpErZdba9l9K--JXhWrJQ1bp3tqdVA

校验

原JWT:

image.png

篡改后JWT:

image.png

相关代码

``` using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text;

string jwt = Console.ReadLine();

string secKey = "mykey123#$$(mykey123#$$(mykey123#$$(mykey123#$$("; JwtSecurityTokenHandler tokenHeader = new(); TokenValidationParameters validParam = new(); var security = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secKey)); validParam.IssuerSigningKey = security; validParam.ValidateIssuer = false; validParam.ValidateAudience = false; ClaimsPrincipal claimsPrincipal = tokenHeader.ValidateToken(jwt, validParam, out SecurityToken securityToken); foreach(var claim in claimsPrincipal.Claims) { Console.WriteLine(claim.Value); }

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值