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;
}
public static string Encrypt(JwtTokenModel data)
{
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,
$"{new DateTimeOffset(DateTime.Now).AddMinutes(120).ToUnixTimeSeconds()}"),
new Claim(JwtRegisteredClaimNames.Iss, iss), // 签发者
new Claim(JwtRegisteredClaimNames.Aud, aud), // 接收者
// new Claim("CompanyId", data.CompanyId), // 公司ID
new Claim("TenantId", data.TenantId), // 租户ID
// new Claim("GID", data.GID.ToString()) // 用户GID
};
// 密钥
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;
}
///
/// token实体
///
public class JwtTokenModel
{
///
/// Id
///
public string Uid { get; set; }
///
/// GID
///
public Guid? GID { get; set; }
///
/// 公司ID
///
public string CompanyId { get; set; }
///
/// 租户ID
///
public string TenantId { get; set; }
}
}