.NetCore开发Jwt认证实现JwtUtil

using Infrastructure;

using Infrastructure.Extensions;

using Model;

using WMS.WebApi.Extensions;

using Microsoft.IdentityModel.Tokens;

using Newtonsoft.Json;

using System.IdentityModel.Tokens.Jwt;

using System.Security.Claims;

using System.Text;

namespace WMS.WebApi.Util

{

public class JwtUtil

{

/// <summary>

/// 获取用户身份信息

/// </summary>

/// <param name="httpContext"></param>

/// <returns></returns>

public static TokenModel GetLoginUser(HttpContext httpContext)

{

string token = httpContext.GetToken();

if (!string.IsNullOrEmpty(token))

{

return ValidateJwtToken(ParseToken(token));

}

return null;

}

/// <summary>

/// 生成token

/// </summary>

/// <param name="claims"></param>

/// <returns></returns>

public static string GenerateJwtToken(List<Claim> claims)

{

JwtSettings jwtSettings = new();

AppSettings.Bind("JwtSettings", jwtSettings);

var authTime = DateTime.Now;

var expiresAt = authTime.AddMinutes(jwtSettings.Expire);

var tokenHandler = new JwtSecurityTokenHandler();

var key = Encoding.ASCII.GetBytes(jwtSettings.SecretKey);

claims.Add(new Claim("Audience", jwtSettings.Audience));

claims.Add(new Claim("Issuer", jwtSettings.Issuer));

var tokenDescriptor = new SecurityTokenDescriptor

{

Subject = new ClaimsIdentity(claims),

Issuer = jwtSettings.Issuer,

Audience = jwtSettings.Audience,

IssuedAt = authTime,//token生成时间

Expires = expiresAt,

//NotBefore = authTime,

TokenType = jwtSettings.TokenType,

//对称秘钥,签名证书

SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)

};

var token = tokenHandler.CreateToken(tokenDescriptor);

return tokenHandler.WriteToken(token);

}

/// <summary>

/// 验证Token

/// </summary>

/// <returns></returns>

public static TokenValidationParameters ValidParameters()

{

JwtSettings jwtSettings = new();

AppSettings.Bind("JwtSettings", jwtSettings);

if (jwtSettings == null || jwtSettings.SecretKey.IsEmpty())

{

throw new Exception("JwtSettings获取失败");

}

var key = Encoding.ASCII.GetBytes(jwtSettings.SecretKey);

var tokenDescriptor = new TokenValidationParameters

{

ValidateIssuerSigningKey = true,

ValidateIssuer = true,

ValidateAudience = true,

ValidIssuer = jwtSettings.Issuer,

ValidAudience = jwtSettings.Audience,

IssuerSigningKey = new SymmetricSecurityKey(key),

ValidateLifetime = true,//是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比

ClockSkew = TimeSpan.FromSeconds(30)

//RequireExpirationTime = true,//过期时间

};

return tokenDescriptor;

}

/// <summary>

/// 从令牌中获取数据声明

/// </summary>

/// <param name="token">令牌</param>

/// <returns></returns>

public static JwtSecurityToken? ParseToken(string token)

{

var tokenHandler = new JwtSecurityTokenHandler();

var validateParameter = ValidParameters();

token = token.Replace("Bearer ", "");

try

{

tokenHandler.ValidateToken(token, validateParameter, out SecurityToken validatedToken);

return tokenHandler.ReadJwtToken(token);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

// return null if validation fails

return null;

}

}

/// <summary>

/// jwt token校验

/// </summary>

/// <param name="jwtSecurityToken"></param>

/// <returns></returns>

public static TokenModel? ValidateJwtToken(JwtSecurityToken jwtSecurityToken)

{

try

{

if (jwtSecurityToken == null) return null;

IEnumerable<Claim> claims = jwtSecurityToken?.Claims;

TokenModel loginUser = null;

var userData = claims.FirstOrDefault(x => x.Type == ClaimTypes.UserData)?.Value;

if (userData != null)

{

loginUser = JsonConvert.DeserializeObject<TokenModel>(userData);

loginUser.ExpireTime = jwtSecurityToken.ValidTo;

}

return loginUser;

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

return null;

}

}

/// <summary>

///组装Claims

/// </summary>

/// <param name="user"></param>

/// <returns></returns>

public static List<Claim> AddClaims(TokenModel user)

{

var claims = new List<Claim>()

{

new Claim(ClaimTypes.PrimarySid, user.UserId.ToString()),

new Claim(ClaimTypes.Name, user.UserName),

new Claim(ClaimTypes.UserData, JsonConvert.SerializeObject(user))

};

return claims;

}

}

}

相关推荐
csdn_aspnet4 天前
MongoDB C# .NetCore 驱动程序 序列化忽略属性
mongodb·c#·.netcore
Tiger_shl5 天前
【.Net技术栈梳理】08-控制反转(IoC)与依赖注入(DI)
开发语言·.net·.netcore
Tiger_shl5 天前
【.Net技术栈梳理】10-.NET Core 程序的执行
开发语言·.net·.netcore
MoFe16 天前
【.net core】【watercloud】登陆后跳转至指定页面,显示在系统框架页内
.netcore
周杰伦fans6 天前
.net core webapi/mvc阿里云服务器部署 - 错误解决
阿里云·mvc·.netcore
驾驭人生8 天前
Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL
数据库·mysql·.netcore
时光追逐者8 天前
C#/.NET/.NET Core技术前沿周刊 | 第 53 期(2025年9.1-9.7)
c#·.net·.netcore
somethingGoWay9 天前
wpf .netcore 导出docx文件
wpf·.netcore
somethingGoWay9 天前
wpf .netcore 导出pdf文件
pdf·wpf·.netcore
切糕师学AI10 天前
如何建立针对 .NET Core web 程序的线程池的长期监控
java·前端·.netcore