115 lines
4.1 KiB
C#
115 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
using System.IO;
|
|
using System.Security.Claims;
|
|
using System.Security.Cryptography;
|
|
using Microsoft.Extensions.Options;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using ZhiZhun.AuthenticationCenter.User;
|
|
using ZhiZhun.AuthenticationCenter.Utility.RSA;
|
|
|
|
namespace ZhiZhun.AuthenticationCenter.Utility
|
|
{
|
|
|
|
public class JWTRSService : IJWTService
|
|
{
|
|
private static Dictionary<string, UserBasicInfo> TokenCache = new Dictionary<string, UserBasicInfo>();
|
|
|
|
#region Option注入
|
|
private readonly JWTTokenOptions _JWTTokenOptions;
|
|
public JWTRSService(IOptionsMonitor<JWTTokenOptions> jwtTokenOptions)
|
|
{
|
|
this._JWTTokenOptions = jwtTokenOptions.CurrentValue;
|
|
}
|
|
#endregion
|
|
|
|
|
|
public string GetToken(UserBasicInfo userModel)
|
|
{
|
|
return this.IssueToken(userModel);
|
|
}
|
|
|
|
|
|
private string IssueToken(UserBasicInfo user, int second = 600*6)
|
|
{
|
|
|
|
var claims = new[]
|
|
{
|
|
//new Claim(ClaimTypes.Name, userModel.Name),
|
|
//new Claim("EMail", userModel.EMail),
|
|
//new Claim("Account", userModel.Account),
|
|
//new Claim("Age", userModel.Age.ToString()),
|
|
//new Claim("Id", userModel.Id.ToString()),
|
|
//new Claim("Mobile", userModel.Mobile),
|
|
//new Claim("Sex", userModel.Sex.ToString())//各种信息拼装
|
|
//new Claim(ClaimTypes.Role,userModel.Role),
|
|
//new Claim("Role", userModel.Role),//这个不能角色授权
|
|
|
|
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())
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
string keyDir = Directory.GetCurrentDirectory();
|
|
if (RSAHelper.TryGetKeyParameters(keyDir, true, out RSAParameters keyParams) == false)
|
|
{
|
|
keyParams = RSAHelper.GenerateAndSaveKey(keyDir);
|
|
}
|
|
var credentials = new SigningCredentials(new RsaSecurityKey(keyParams), SecurityAlgorithms.RsaSha256Signature);
|
|
|
|
var token = new JwtSecurityToken(
|
|
issuer: this._JWTTokenOptions.Issuer,
|
|
audience: this._JWTTokenOptions.Audience,
|
|
claims: claims,
|
|
expires: DateTime.Now.AddSeconds(second),//默认10分钟有效期
|
|
notBefore: DateTime.Now.AddMilliseconds(30),
|
|
signingCredentials: credentials);
|
|
var handler = new JwtSecurityTokenHandler();
|
|
string tokenString = handler.WriteToken(token);
|
|
return tokenString;
|
|
}
|
|
|
|
|
|
|
|
/// <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 "";
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
}
|