.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;

}

}

}

相关推荐
The Sheep 20232 小时前
.NetCoreMVC 开发网页使用sass
.netcore·sass
宝桥南山1 天前
.NET10 - 尝试一下Blazor Web Assembly Standalone App的fingerprint新特性
microsoft·微软·c#·asp.net·.net·.netcore
刚子编程3 天前
ASP.NET Core Blazor 核心功能一:Blazor依赖注入与状态管理指南
开发语言·.netcore·blazor
是萝卜干呀3 天前
Backend - HTTP请求的常用返回类型(asp .net core MVC)
http·c#·.netcore·iactionresult
精神小伙就是猛3 天前
.Net Core基于EasyCore.EventBus实现事件总线
微服务·.netcore
sky-stars5 天前
Visual Studio 2022 安装使用:Entity Framework Core
asp.net·.netcore·visual studio
宝桥南山6 天前
.NET - .NET Aspire的Command-Line和GitHub Copilot
microsoft·微软·c#·asp.net·.net·.netcore
刚子编程8 天前
ASP.NET Core Blazor 路由配置和导航
服务器·javascript·.netcore·blazor
忧郁的蛋~10 天前
.NET实现多任务异步与并行处理的详细步骤
后端·c#·asp.net·.net·.netcore
时光追逐者11 天前
C#/.NET/.NET Core技术前沿周刊 | 第 58 期(2025年10.13-10.19)
微软·开源·c#·.net·.netcore