88 lines
2.6 KiB
C#
88 lines
2.6 KiB
C#
|
using System.IdentityModel.Tokens.Jwt;
|
|||
|
using System.Security.Claims;
|
|||
|
using System.Text;
|
|||
|
using Microsoft.IdentityModel.Tokens;
|
|||
|
using Newtonsoft.Json;
|
|||
|
|
|||
|
namespace Bunny.Common.Utils.Jwt;
|
|||
|
|
|||
|
public static partial class JwtUtil
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 默认发布者
|
|||
|
/// </summary>
|
|||
|
private const string JwtKey = "这你放的是你的秘钥,必须要256位以上,否则会报错";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 默认发布者
|
|||
|
/// </summary>
|
|||
|
private const string Issuer = "Bunny-Issuer";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 默认接受者
|
|||
|
/// </summary>
|
|||
|
private const string Audience = "Bunny-Audience";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 默认有效时间,按天计算
|
|||
|
/// </summary>
|
|||
|
private const int Day = 7;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 判断是否过期
|
|||
|
/// </summary>
|
|||
|
/// <param name="jwtToken">token</param>
|
|||
|
/// <returns>过期:true,未过期:false</returns>
|
|||
|
public static bool IsJwtExpired(string? jwtToken)
|
|||
|
{
|
|||
|
var tokenHandler = new JwtSecurityTokenHandler();
|
|||
|
|
|||
|
// Token无效直接返回过期
|
|||
|
if (tokenHandler.ReadToken(jwtToken) is not JwtSecurityToken jwtTokenObj) return true;
|
|||
|
|
|||
|
// 判断是否过期
|
|||
|
return DateTime.UtcNow > jwtTokenObj.ValidTo;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 生成 SigningCredentials
|
|||
|
/// </summary>
|
|||
|
private static SigningCredentials Credentials(string jwtKey)
|
|||
|
{
|
|||
|
var symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));
|
|||
|
return new SigningCredentials(symmetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 将字典转为实体类
|
|||
|
/// </summary>
|
|||
|
/// <param name="dictionary">字典</param>
|
|||
|
/// <returns>所对应的实体类</returns>
|
|||
|
// public static T? ConvertDictionaryToObject(Dictionary<string, object> dictionary)
|
|||
|
// {
|
|||
|
// var json = JsonConvert.SerializeObject(dictionary);
|
|||
|
// // 将JSON转为对象
|
|||
|
// return JsonConvert.DeserializeObject<T>(json);
|
|||
|
// }
|
|||
|
public static T? ConvertDictionaryToObject<T>(Dictionary<string, object> dictionary)
|
|||
|
{
|
|||
|
var json = JsonConvert.SerializeObject(dictionary);
|
|||
|
// 将JSON转为对象
|
|||
|
return JsonConvert.DeserializeObject<T>(json);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 将对象转为Claim
|
|||
|
/// </summary>
|
|||
|
/// <param name="object">要转换的对象</param>
|
|||
|
/// <returns>Claim</returns>
|
|||
|
public static IEnumerable<Claim> CreateClaim<T>(T @object)
|
|||
|
{
|
|||
|
// 将对象序列化成JSON
|
|||
|
var json = JsonConvert.SerializeObject(@object);
|
|||
|
|
|||
|
// 将JSON复制给Claim
|
|||
|
return ParseJsonToClaimEnumerable(json);
|
|||
|
}
|
|||
|
}
|