104 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C#
		
	
	
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.IdentityModel.Tokens.Jwt;
 | ||
| using System.Security.Claims;
 | ||
| using System.Text;
 | ||
| using Microsoft.Extensions.Options;
 | ||
| using Microsoft.IdentityModel.Tokens;
 | ||
| using ZhiZhun.AuthenticationCenter.User;
 | ||
| 
 | ||
| namespace ZhiZhun.AuthenticationCenter.Utility
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// 对称可逆加密
 | ||
|     /// </summary>
 | ||
|     public class JWTHSService : IJWTService
 | ||
|     {
 | ||
|         private static Dictionary<string, UserBasicInfo> TokenCache = new Dictionary<string, UserBasicInfo>();
 | ||
| 
 | ||
|         #region Option注入
 | ||
|         private readonly JWTTokenOptions _JWTTokenOptions;
 | ||
|         public JWTHSService(IOptionsMonitor<JWTTokenOptions> jwtTokenOptions)
 | ||
|         {
 | ||
|             this._JWTTokenOptions = jwtTokenOptions.CurrentValue;
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         public string GetToken(UserBasicInfo userModel)
 | ||
|         {
 | ||
|             return this.IssueToken(userModel);
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 刷新token的有效期问题上端校验
 | ||
|         /// </summary>
 | ||
|         /// <param name="refreshToken"></param>
 | ||
|         /// <returns></returns>
 | ||
|         public string GetTokenByRefresh(string refreshToken)
 | ||
|         {
 | ||
|             if (TokenCache.ContainsKey(refreshToken))
 | ||
|             {
 | ||
|                 string token = this.IssueToken(TokenCache[refreshToken], 60);
 | ||
|                 return token;
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 return "";
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 2个token  就是有效期不一样
 | ||
|         /// </summary>
 | ||
|         /// <param name="userInfo"></param>
 | ||
|         /// <returns></returns>
 | ||
|         public Tuple<string, string> GetTokenWithRefresh(UserBasicInfo userInfo)
 | ||
|         {
 | ||
|             string token = this.IssueToken(userInfo, 60);//1分钟
 | ||
|             string refreshToken = this.IssueToken(userInfo, 60 * 60 * 24);//24小时
 | ||
|             TokenCache.Add(refreshToken, userInfo);
 | ||
| 
 | ||
|             return Tuple.Create(token, refreshToken);
 | ||
|         }
 | ||
| 
 | ||
|         /**
 | ||
|             * Claims (Payload)
 | ||
|                Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:
 | ||
|                iss: The issuer of the token,token 是给谁的
 | ||
|                sub: The subject of the token,token 主题
 | ||
|                exp: Expiration Time。 token 过期时间,Unix 时间戳格式
 | ||
|                iat: Issued At。 token 创建时间, Unix 时间戳格式
 | ||
|                jti: JWT ID。针对当前 token 的唯一标识
 | ||
|                除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
 | ||
|             * */
 | ||
|         private string IssueToken(UserBasicInfo user, int second = 600)
 | ||
|         {
 | ||
|             var claims = new[]
 | ||
|             {
 | ||
|                 new Claim(Microsoft.IdentityModel.JsonWebTokens.JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
 | ||
|                 new Claim("id", user.Id.ToString()),
 | ||
|                 new Claim("name", user.UserName),
 | ||
|                 new Claim("realName", user.RealName),
 | ||
|                 new Claim("reviewerCode",user.ReviewerCode),
 | ||
|                 new Claim("userTypeEnumName",user.UserTypeEnum.ToString()),
 | ||
|                 new Claim("userTypeEnumInt",((int)user.UserTypeEnum).ToString()),
 | ||
|                 new Claim("userTypeShortName",user.UserTypeShortName),
 | ||
|                 new Claim("isAdmin",(user.UserTypeEnum==UserType.SuperAdmin).ToString())
 | ||
|             };
 | ||
|             var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(this._JWTTokenOptions.SecurityKey));
 | ||
|             var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
 | ||
| 
 | ||
|            
 | ||
|             var token = new JwtSecurityToken(
 | ||
|                 issuer: this._JWTTokenOptions.Issuer,
 | ||
|                 audience: this._JWTTokenOptions.Audience,
 | ||
|                 claims: claims,
 | ||
|                 expires: DateTime.Now.AddSeconds(second),//10分钟有效期
 | ||
|                 notBefore: null,//立即生效  DateTime.Now.AddMilliseconds(30),//30s后有效
 | ||
|                 signingCredentials: creds);
 | ||
|             string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
 | ||
|             return returnToken;
 | ||
|         }
 | ||
|     }
 | ||
| }
 |