[TOC]
安装相关包
System.IdentityModel.Tokens.Jwt
解密加密如下:
C
[HttpGet("Jwt")]
public IActionResult Jwt()
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, "6")); //一个Claim就代表一条用户信息,new Claim(type,value),type可以重复
claims.Add(new Claim(ClaimTypes.Name, "yzk"));
claims.Add(new Claim(ClaimTypes.Role, "User"));
claims.Add(new Claim(ClaimTypes.Role, "Admin"));
claims.Add(new Claim("PassPort", "E90000082"));//自定义
string key = "fasdfad&9045dafz222#fadpio@0232 this_is_a_very_long_secret_key_32b";//密钥
DateTime expires = DateTime.Now.AddDays(1);//客户端时间
byte[] secBytes = Encoding.UTF8.GetBytes(key);//将密钥二进制
var secKey = new SymmetricSecurityKey(secBytes);//创建签名密钥
var credentials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256Signature);//定义签名算法和密钥
var tokenDescriptor = new JwtSecurityToken(claims: claims,
expires: expires, signingCredentials: credentials);
string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor); //生成最终的 JWT 字符串(header.payload.signature)
return Ok(jwt);
}
[HttpPost(" ReJwt")]
public IActionResult ReJwt(string jwt)
{
string secKey = "fasdfad&9045dafz222#fadpio@0232";
secKey = "fasdfad&9045dafz222#fadpio@0232 this_is_a_very_long_secret_key_32b";//密钥
JwtSecurityTokenHandler tokenHandler = new();
TokenValidationParameters valParam = new();
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secKey));
valParam.IssuerSigningKey = securityKey;
valParam.ValidateIssuer = false;
valParam.ValidateAudience = false;
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwt,
valParam, out SecurityToken secToken);
// 方法:用数组初始化器 + ToList()
var strss = new[] { new { type = "", value = "" } }.ToList();
foreach (var claim in claimsPrincipal.Claims)
{
//Console.WriteLine($"{claim.Type}={claim.Value}");
strss.Add(new { type = claim.Type, value = claim.Value });
}
return Ok(strss);
}