using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using Bunny.Common.Exception; using Bunny.Dao.Entity.Constant; using Newtonsoft.Json; namespace Bunny.Common.Utils.Jwt; public static partial class JwtUtil { /// /// 返回所有的 jwt /// /// token解析 public static JwtSecurityToken JwtParse(string token) { if (token == null) return null; var tokenHandler = new JwtSecurityTokenHandler(); return tokenHandler.ReadJwtToken(token); } /// /// 返回发行者 /// /// token解析 public static string JwtParseIssuer(string jwt) { return JwtParse(jwt).Issuer; } /// /// 返回授权者 /// /// token解析 public static IEnumerable JwtParseAudiences(string jwt) { return JwtParse(jwt).Audiences; } /// /// 返回负载中内容 /// /// jwt 解析 public static IEnumerable JwtParseClaim(string jwt) { return JwtParse(jwt).Claims; } /// /// 将生成的JWT值转成字典格式 /// /// /// Dictionary public static Dictionary ParseJwtToDictionary(string jwt) { var tokenHandler = new JwtSecurityTokenHandler(); var jwtSecurityToken = tokenHandler.ReadJwtToken(jwt); // 初始化字典 var dictionary = new Dictionary(); var jClaims = jwtSecurityToken.Claims; // 将得到的每一个值都放入字典中 foreach (var claim in jClaims) dictionary[claim.Type] = claim.Value; // 返回字典 return dictionary; } /// /// 将生成的 JwtSecurityToken 值转成字典格式 /// /// /// Dictionary public static Dictionary ParseJwtToDictionary(JwtSecurityToken jwtToken) { // 初始化字典 var dictionary = new Dictionary(); // 将得到的每一个值都放入字典中 foreach (var claim in jwtToken.Claims) dictionary[claim.Type] = claim.Value; // 返回字典 return dictionary; } /// /// 将 jwt 转成 实体类 /// /// jwt /// 实体类 public static T? ParseJwtToObject(string jwt) { if (jwt == null) throw new BunnyException(ExceptionConstant.TokenIsEmpty); var dictionary = new Dictionary(); // 将 jwt 转成 Claim var claims = JwtParseClaim(jwt); // 找到对应的字典 Dictionary foreach (var claim in claims) dictionary[claim.Type] = claim.Value; // 返回实体类 var json = JsonConvert.SerializeObject(dictionary); // 将JSON转为对象 return JsonConvert.DeserializeObject(json); } /// /// 将 JSON 转成 Dictionary /// /// /// Dictionary public static Dictionary ParseJsonToDictionary(string jsonString) { // 初始化字典 var dictionary = new Dictionary(); // 将JSON转成字典格式 var claims = ParseJsonToClaimEnumerable(jsonString); // 将得到的每一个值都放入字典中 foreach (var claim in claims) dictionary[claim.Type] = claim.Value; // 返回 Dictionary return dictionary; } /// /// 将 JSON 转成 Claim /// /// /// Claim public static IEnumerable ParseJsonToClaimEnumerable(string jsonString) { // 将JSON转成字典格式 var deserializeWithDictionary = JsonConvert.DeserializeObject>(jsonString); // 返回Claim return deserializeWithDictionary!.Select(item => { if (item.Value == null) return new Claim(item.Key, string.Empty); return new Claim(item.Key, item.Value.ToString()!); }) .ToList(); } /// /// 将 JSON 转成 实体类 /// /// JSON字符串 /// 实体类 public static T? ParseJsonToObject(string jsonString) { // 将JSON转成字典格式 var claims = ParseJsonToClaimEnumerable(jsonString); // 初始化字典 var dictionary = new Dictionary(); // 将得到的每一个值都放入字典中 foreach (var claim in claims) dictionary[claim.Type] = claim.Value; // 返回实体类 var json = JsonConvert.SerializeObject(dictionary); // 将JSON转为对象 return JsonConvert.DeserializeObject(json); } /// /// 将 Claim 抓成 Dictionary /// /// /// Dictionary public static Dictionary ParseClaimToDictionary(IEnumerable claims) { // 初始化字典 var dictionary = new Dictionary(); // 将得到的每一个值都放入字典中 foreach (var claim in claims) dictionary[claim.Type] = claim.Value; // 返回字典格式 return dictionary; } }