ASP.NET Core JWT授权验证----刷新Token

- JWT

通过原有的Token 拉取新Token

   [HttpGet]
   [Route("RefreshToken")]
   public async Task RefreshToken(string token = "")
   {
       string jwtStr = string.Empty;
       if (string.IsNullOrEmpty(token))
       {
           return new MessageModel()
           {
               success = false,
               status = 500,
               msg = "token无效,请重新登录!",
           };
       }
       var tokenModel = JwtHelper.SerializeJwt(token);
       if (tokenModel != null && JwtHelper.customSafeVerify(token) && tokenModel.Uid > 0)
       {
           //var user = await _sysUserInfoServices.QueryById(tokenModel.Uid);
           var user = new SysUserInfo {Id = 1, TenantId = 1001,LoginName = "testuser", CriticalModifyTime = DateTime.Now
           };
           var value = User.Claims.SingleOrDefault(s => s.Type == JwtRegisteredClaimNames.Iat)?.Value;
           if (value != null && user.CriticalModifyTime > value.ObjToDate())
           {
               return new MessageModel()
               {
                   success = false,
                   status = 500,
                   msg = "t很抱歉,授权已失效,请重新授权!",
               };
           }
           if (user != null && !(value != null && user.CriticalModifyTime > value.ObjToDate()))
           {
               //var userRoles = await _sysUserInfoServices.GetUserRoleNameStr(user.LoginName, user.LoginPWD);
               var userRoles = "Admin,System,user,DXLSystem";
               //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色
               var claims = new List               {
                   new Claim(ClaimTypes.Name, user.LoginName),
                   new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ObjToString()),
                   new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.ToString()),
                   new Claim(ClaimTypes.Expiration,
                       DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString())
               };
               claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));

               //用户标识
               var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
               identity.AddClaims(claims);
               var refreshToken = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
               return new MessageModel()
               {
                   success = true,
                   status = 200,
                   msg = "获取成功",
                   response = refreshToken
               };
           }
       }
       
           return new MessageModel()
           {
               success = false,
               status = 500,
               msg = "认证失败",
           };
       
   }

用到辅助类 :

 public class JwtHelper
 {
      public static string IssueJwt(TokenModelJwt tokenModel)
     {
         string iss = AppSettings.app(new string[] { "Audience", "Issuer" });
         string aud = AppSettings.app(new string[] { "Audience", "Audience" });
         string secret = AppSecretConfig.Audience_Secret_String;

         //var claims = new Claim[] //old
         var claims = new List             {
              /*
              * 特别重要:
                1、这里将用户的部分信息,比如 uid 存到了Claim 中,如果你想知道如何在其他地方将这个 uid从 Token 中取出来,请看下边的SerializeJwt() 方法,或者在整个解决方案,搜索这个方法,看哪里使用了!
                2、你也可以研究下 HttpContext.User.Claims ,具体的你可以看看 Policys/PermissionHandler.cs 类中是如何使用的。
              */
             new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ToString()),
             new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
             new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
             //这个就是过期时间,目前是过期1000秒,可自定义,注意JWT有自己的缓冲过期时间
             new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(1000)).ToUnixTimeSeconds()}"),
             new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(1000).ToString()),
             new Claim(JwtRegisteredClaimNames.Iss,iss),
             new Claim(JwtRegisteredClaimNames.Aud,aud),
             //new Claim(ClaimTypes.Role,tokenModel.Role),//为了解决一个用户多个角色(比如:Admin,System),用下边的方法
            };
         // 可以将一个用户的多个角色全部赋予;
         claims.AddRange(tokenModel.Role.Split(',').Select(s => new Claim(ClaimTypes.Role, s)));
         //秘钥 (SymmetricSecurityKey 对安全性的要求,密钥的长度太短会报出异常)
         var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
         var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
         var jwt = new JwtSecurityToken(
             issuer: iss,
             claims: claims,
             signingCredentials: creds);
         var jwtHandler = new JwtSecurityTokenHandler();
         var encodedJwt = jwtHandler.WriteToken(jwt);
         return encodedJwt;
     }

      public static TokenModelJwt SerializeJwt(string jwtStr)
     {
         var jwtHandler = new JwtSecurityTokenHandler();
         TokenModelJwt tokenModelJwt = new TokenModelJwt();
         // token校验
         if (jwtStr.IsNotEmptyOrNull() && jwtHandler.CanReadToken(jwtStr))
         {
             JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);
             object role;
             jwtToken.Payload.TryGetValue(ClaimTypes.Role, out role);
             tokenModelJwt = new TokenModelJwt
             {
                 Uid = (jwtToken.Id).ObjToLong(),
                 Role = role != null ? role.ObjToString() : "",
             };
         }
         return tokenModelJwt;
     }

     public static bool customSafeVerify(string token)
     {
         var jwtHandler = new JwtSecurityTokenHandler();
         var symmetricKeyAsBase64 = AppSecretConfig.Audience_Secret_String;
         var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);
         var signingKey = new SymmetricSecurityKey(keyByteArray);
         var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
         var jwt = jwtHandler.ReadJwtToken(token);
         return jwt.RawSignature == Microsoft.IdentityModel.JsonWebTokens.JwtTokenUtilities.CreateEncodedSignature(jwt.RawHeader + "." + jwt.RawPayload, signingCredentials);
     }
 }

  public class TokenModelJwt
 {
     public long Uid { get; set; }
     public string Role { get; set; }
     public string Work { get; set; }

 }