using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Net.Http; using System.Security.Claims; using System.Text; using YLErp; namespace YLErp.Helpers { /// /// 用户认证帮助类 /// public class AuthHelper { public const string CookieAuthType = "yc_identity"; public const string JwtAuthType = "yc_mapi"; /// /// 登录Token过期时间(秒) /// public static int ExpireInSeconds => PS.Config?.ErpElement?.LoginTokenExpireSeconds ?? 3600 * 10; // 默认10小时 public const string JwtIssuer = "yilian"; public const string JwtAudience = "yilian"; public const string JwtSecretKey = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrkzI1NiJ9eyJjbGFTT"; public const string JwtUserToken = "###jwt###"; public static string CreateJwtToken(ClaimsIdentity identity) { var key = new SymmetricSecurityKey(Convert.FromBase64String(JwtSecretKey)); var claims = new ClaimsIdentity(identity); if (!claims.HasClaim(c => c.Type == "jti")) { claims.AddClaim(new Claim("jti", Guid.NewGuid().ToString("N"))); } var tokenDescriptor = new SecurityTokenDescriptor { Subject = claims, Expires = DateTime.UtcNow.AddSeconds(ExpireInSeconds), Issuer = JwtIssuer, Audience = JwtAudience, SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha512) }; var tokenHandler = new JwtSecurityTokenHandler(); var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } /// /// 解析JWT token /// /// JWT token字符串 /// 解析后的JWT token对象 public static JwtSecurityToken ParseJwtToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); return tokenHandler.ReadJwtToken(token); } /// /// 检查token是否需要续期 /// /// JWT token对象 /// 续期阈值(秒) /// 是否需要续期 public static bool NeedRefreshToken(JwtSecurityToken token, int thresholdSeconds = 3600) { var timeUntilExpiry = token.ValidTo - DateTime.UtcNow; return timeUntilExpiry.TotalSeconds < thresholdSeconds; } } }