username@email.com
2023-08-29 ca12247dbc0728c7900db4188565d4c4f7d907c4
DocumentServiceAPI.Application/UserAndLogin/Services/TokenService.cs
@@ -3,10 +3,13 @@
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;
@@ -18,7 +21,7 @@
    /// <summary>
    /// token服务类
    /// </summary>
    public  class TokenService: IScoped
    public class TokenService : IScoped
    {
        /// <summary>
        /// Token是啥
@@ -27,7 +30,7 @@
        private ISqlSugarClient _db;
        private UserService _UserService;
        private IRedisCacheService _RedisCase;
        public TokenService(ISqlSugarClient db, UserService  UserInfoService, IRedisCacheService RedisCase ) {
        public TokenService(ISqlSugarClient db, UserService UserInfoService, IRedisCacheService RedisCase) {
            _db = db;
            _UserService = UserInfoService;
            _RedisCase = RedisCase;
@@ -36,9 +39,9 @@
        /// 新建一个TOken 
        /// </summary>
        /// <returns></returns>
        public string  CreateToken(JwtInfo jwt)
        public string CreateToken(JwtInfo jwt)
        {
            string TokenKey=TokenKeys+ getTokenKey(jwt);
            string TokenKey = TokenKeys + getTokenKey(jwt);
            IDictionary<string, object> propertyDictionary = new Dictionary<string, object>();
            PropertyInfo[] properties = jwt.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
@@ -51,14 +54,57 @@
                propertyDictionary.Add(propertyName.ToLower(), propertyValue);
            }
            var ID = IDGen.NextID();
             jwt.JID = ID;
         var token=   JWTEncryption.Encrypt(propertyDictionary, App.GetConfig<JWTSettingsOptions>("JWTSettings").ExpiredTime ?? 3600);
            if(jwt.LogInSource==LogInFrom.PC)
            _RedisCase.Add<string>(TokenKey, ID.ToString(), expireSeconds: (int )(App.GetConfig<JWTSettingsOptions>("JWTSettings").ExpiredTime??3600));
            jwt.JID = ID;
            var token = JWTEncryption.Encrypt(propertyDictionary, App.GetConfig<JWTSettingsOptions>("JWTSettings").ExpiredTime ?? 3600);
            if (jwt.LogInSource == LogInFrom.PC)
                _RedisCase.Add<string>(TokenKey, ID.ToString(), expireSeconds: (int)(App.GetConfig<JWTSettingsOptions>("JWTSettings").ExpiredTime ?? 3600));
            return token;
        }
        /// <summary>
        /// 校验token 的有效性
        /// </summary>
        /// <param name="Token"> Token校验</param>
        /// <param name="validationParameters"></param>
        /// <param name="securityToken"></param>
        /// <returns></returns>
        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<TokenService>();
              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;
            }
        }
        /// <summary>
@@ -88,9 +134,13 @@
        /// <returns></returns>
        private string getTokenKey(JwtInfo jwt)
        {
            string TokenKey = TokenKeys + jwt.EID?.ToString() + jwt.UID?.ToString()  + jwt.TID?.ToString();
            string TokenKey = TokenKeys + jwt.EID?.ToString() + jwt.UID?.ToString()  + jwt.TEID?.ToString();
            return TokenKey;
        }
    }
   
}