using DS.Module.Core.Extensions;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace DS.Module.Core;
public class JwtHelper
{
///
/// 生成JWT字符串
///
///
///
public static string GetJWT(string Jti)
{
DateTime utc = DateTime.UtcNow;
string iss = AppSetting.app(new string[] { "JwtSettings", "Issuer" });
string aud = AppSetting.app(new string[] { "JwtSettings", "Audience" });
string secret = AppSetting.app(new string[] { "JwtSettings", "SecretKey" });
var claims = new List
{
new Claim(JwtRegisteredClaimNames.Jti, Jti),
// 令牌颁发时间
new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Nbf, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
// 过期时间 2小时
new Claim(JwtRegisteredClaimNames.Exp,
$"{new DateTimeOffset(DateTime.Now).AddMinutes(120).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Iss, iss), // 签发者
new Claim(JwtRegisteredClaimNames.Aud, aud) // 接收者
};
// 密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenHandler = new JwtSecurityTokenHandler();
JwtSecurityToken jwt = new JwtSecurityToken(
issuer: iss,
claims: claims, // 声明的集合
//expires: .AddSeconds(36), // token的有效时间
signingCredentials: creds
);
var handler = new JwtSecurityTokenHandler();
// 生成 jwt字符串
var strJWT = handler.WriteToken(jwt);
return strJWT;
}
///
/// 生成Token
///
///
/// 是否刷新
/// 是否客户端
///
public static string Encrypt(JwtTokenModel data, bool isRefresh = false,bool isClient = false)
{
DateTime utc = DateTime.UtcNow;
string iss = AppSetting.app(new string[] { "JwtSettings", "Issuer" });
string aud = AppSetting.app(new string[] { "JwtSettings", "Audience" });
string secret = AppSetting.app(new string[] { "JwtSettings", "SecretKey" });
var claims = new List
{
new Claim(JwtRegisteredClaimNames.Jti, data.Uid),
// 令牌颁发时间
new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Nbf, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),
// 过期时间 2小时
new Claim(JwtRegisteredClaimNames.Exp,
isRefresh
? $"{new DateTimeOffset(DateTime.Now).AddMinutes(150).ToUnixTimeSeconds()}" :$"{new DateTimeOffset(DateTime.Now).AddMinutes(120).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Iss, iss), // 签发者
new Claim(JwtRegisteredClaimNames.Aud, aud), // 接收者
// new Claim("OrgId", data.OrgId), // 公司ID
new Claim("TenantId", data.TenantId), // 租户ID
};
// 添加机构信息
if (isClient)
{
claims.Add(new Claim("OrgId", data.OrgId));// 机构ID
}
// 密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenHandler = new JwtSecurityTokenHandler();
JwtSecurityToken jwt = new JwtSecurityToken(
issuer: iss,
claims: claims, // 声明的集合
//expires: .AddSeconds(36), // token的有效时间
signingCredentials: creds
);
var handler = new JwtSecurityTokenHandler();
// 生成 jwt字符串
var strJWT = handler.WriteToken(jwt);
return strJWT;
}
///
/// 解析
///
///
///
public static string SerializeJwt(string jwtStr)
{
var jwtHandler = new JwtSecurityTokenHandler();
string userId = string.Empty;
// token校验
if (jwtStr.IsNullOrEmpty() && jwtHandler.CanReadToken(jwtStr))
{
JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);
userId = jwtToken.Claims.First().Value;
}
return userId;
}
///
/// 对jwt字符串 解码
///
public static Dictionary DecodeJwt(string accessToken)
{
Dictionary dic = new Dictionary();
var jwtHandler = new JwtSecurityTokenHandler();
// token校验
if (!string.IsNullOrEmpty(accessToken) && jwtHandler.CanReadToken(accessToken))
{
JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(accessToken);
var claims = jwtToken.Claims;
foreach (var claim in claims)
{
dic.Add(claim.Type, claim.Value);
}
}
return dic;
}
///
/// token实体
///
public class JwtTokenModel
{
///
/// Id
///
public string Uid { get; set; }
///
/// GID
///
public Guid? GID { get; set; }
///
/// 机构ID
///
public string OrgId { get; set; }
///
/// 租户ID
///
public string TenantId { get; set; }
}
}