using Microsoft.AspNetCore.Http; using Microsoft.IdentityModel.Tokens; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using ZR.Admin.WebApi.Extensions; using ZR.Model.System; namespace ZR.Admin.WebApi.Framework { /// /// 2020-11-20 /// public class JwtUtil { public static readonly string KEY = "asdfghjklzxcvbnm"; /// /// 获取用户身份信息 /// /// /// public static LoginUser GetLoginUser(HttpContext httpContext) { string token = HttpContextExtension.GetToken(httpContext); if (!string.IsNullOrEmpty(token)) { return ValidateJwtToken(ParseToken(token)); } return null; } /// /// 生成token /// /// /// public static string GenerateJwtToken(List claims) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(KEY); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), //Issuer = "", //Audience = "", Expires = DateTime.Now.AddDays(7), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } /// /// 从令牌中获取数据声明 /// /// 令牌 /// public static IEnumerable ParseToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(KEY); try { tokenHandler.ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false, // set clockskew to zero so tokens expire exactly at token expiration time (instead of 5 minutes later) ClockSkew = TimeSpan.Zero }, out SecurityToken validatedToken); //{{"alg":"HS256","typ":"JWT"}.{"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid":"2","unique_name":"ry","nameid":"2","given_name":"若依","nbf":1606654010,"exp":1606740410,"iat":1606654010}} var jwtToken = (JwtSecurityToken)validatedToken; return jwtToken.Claims; } catch (Exception ex) { Console.WriteLine(ex.Message); // return null if validation fails return null; } } /// /// jwt token校验 /// /// /// private static LoginUser ValidateJwtToken(IEnumerable jwtToken) { try { var userId = jwtToken.FirstOrDefault(x => x.Type == "primarysid").Value; var userName = jwtToken.FirstOrDefault(x => x.Type == "unique_name").Value; var userData = jwtToken.FirstOrDefault(x => x.Type == ClaimTypes.UserData).Value; LoginUser loginUser = JsonConvert.DeserializeObject(userData); return loginUser; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } } } }