using DocumentServiceAPI.Model; using DocumentServiceAPI.Services.IService; using Furion.Authorization; using Furion.DistributedIDGenerator; using Furion.JsonSerialization; using Furion.Logging.Extensions; using Microsoft.IdentityModel.Tokens; using NetTaste; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Reflection; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace DocumentServiceAPI.Application.UserAndLogin.Services { /// /// token服务类 /// public class TokenService : IScoped { /// /// Token是啥 /// static string TokenKeys = "TokenKeys:"; private ISqlSugarClient _db; private UserService _UserService; private IRedisCacheService _RedisCase; public TokenService(ISqlSugarClient db, UserService UserInfoService, IRedisCacheService RedisCase) { _db = db; _UserService = UserInfoService; _RedisCase = RedisCase; } /// /// 新建一个TOken /// /// public string CreateToken(JwtInfo jwt) { string TokenKey = TokenKeys + getTokenKey(jwt); IDictionary propertyDictionary = new Dictionary(); PropertyInfo[] properties = jwt.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo property in properties) { string propertyName = property.Name; object propertyValue = property.GetValue(jwt); propertyDictionary.Add(propertyName.ToLower(), propertyValue); } var ID = IDGen.NextID(); jwt.JID = ID; var token = JWTEncryption.Encrypt(propertyDictionary, App.GetConfig("JWTSettings").ExpiredTime ?? 3600); if (jwt.LogInSource == LogInFrom.PC) _RedisCase.Add(TokenKey, ID.ToString(), expireSeconds: (int)(App.GetConfig("JWTSettings").ExpiredTime ?? 3600)); return token; } /// /// 校验token 的有效性 /// /// Token校验 /// /// /// public bool CheckJwt(string Token, out SecurityToken? securityToken) { var configuration = App.Configuration; // var value = configuration["xxx:xxx"]; string secretKey = configuration["ZCUserInfoJwtOP:SecurityKey"]; if (secretKey == null) { "没有配置用户中心的安全秘钥 ZCUserInfoJwtOP:SecurityKey 找不到".LogInformation(); throw Oops.Oh("配置错误,联系管理员"); } JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler(); //JwtSecurityToken jwt = tokenHandler.ReadJwtToken(Token); // 验证 JWT 签名并检查有效期 TokenValidationParameters validationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)), ValidateIssuer = false, ValidateAudience = false, ClockSkew = TimeSpan.Zero // 禁用时间偏移量 }; try { ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(Token, validationParameters, out SecurityToken validatedToken); securityToken = validatedToken; return true; } catch (SecurityTokenException) { securityToken=null; return false; } } /// /// 校验jwt信息是否有效,判决单端登录验证 /// /// public bool CheckToken() { var Jwtinfo= _UserService.GetJwtInfo(); var Key= getTokenKey(Jwtinfo); string T = _RedisCase.Get(Key); if (T == null) return true; if (T != Jwtinfo.JID.ToString()) return false; return true; } /// /// 获取TokenKey /// /// /// private string getTokenKey(JwtInfo jwt) { string TokenKey = TokenKeys + jwt.EID?.ToString() + jwt.UID?.ToString() + jwt.TEID?.ToString(); return TokenKey; } } }