67 lines
2.4 KiB
C#
67 lines
2.4 KiB
C#
using Microsoft.IdentityModel.Tokens;
|
|
using SqlSugar.Extensions;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Linq;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
|
|
namespace Learn.Archives.Core.Common
|
|
{
|
|
public class JwtHelper
|
|
{
|
|
|
|
public static string GetToken(AuthKeyConfig jwt, params Claim[] claims)
|
|
{
|
|
return GetToken(jwt.Issuer, jwt.Audience, jwt.Secret, jwt.Expires, claims);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成Token
|
|
/// </summary>
|
|
/// <param name="issuer">签发人</param>
|
|
/// <param name="audience">受众</param>
|
|
/// <param name="secreKey">密钥</param>
|
|
/// <param name="expires">过期时间(单位:小时)</param>
|
|
public static string GetToken(string issuer, string audience, string secreKey, int expires, params Claim[] claims)
|
|
{
|
|
var now = DateTime.Now;
|
|
//添加用户的信息,转成一组声明,还可以写入更多用户信息声明
|
|
var claimss = new List<Claim>
|
|
{
|
|
//JWT ID 唯一标识符
|
|
new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString() ),
|
|
//发布时间戳 issued timestamp
|
|
new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64),
|
|
};
|
|
if (claims != null && claims.Length > 0)
|
|
{
|
|
claimss.AddRange(claims);
|
|
}
|
|
|
|
//下面使用 Microsoft.IdentityModel.Tokens帮助库下的类来创建JwtToken
|
|
//安全秘钥
|
|
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secreKey));
|
|
|
|
var jwt = new JwtSecurityToken(
|
|
//jwt签发人
|
|
issuer: issuer,
|
|
//jwt受众
|
|
audience: audience,
|
|
//jwt一组声明
|
|
claims: claimss,
|
|
notBefore: now,
|
|
//jwt令牌过期时间
|
|
expires: now.AddHours(value: expires),
|
|
//签名凭证: 安全密钥、签名算法
|
|
signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)
|
|
);
|
|
|
|
//生成jwt令牌(json web token)
|
|
var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
|
|
return encodedJwt;
|
|
}
|
|
}
|
|
}
|