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

}

}

}

相关推荐
时光追逐者1 天前
.NET 9 中 LINQ 新增功能实操
开发语言·开源·c#·.net·.netcore·linq·微软技术
宝桥南山3 天前
.NET 9 - BinaryFormatter移除
microsoft·微软·c#·asp.net·.net·.netcore
PasteSpider4 天前
贴代码框架PasteForm特性介绍之datetime,daterange
前端·html·.netcore·crud
csdn_aspnet4 天前
ASP.NET Core Webapi 返回数据的三种方式
.netcore
技术拾荒者6 天前
Net.Core Mvc 添加 log 日志
c#·asp.net·mvc·.netcore
一包烟电脑面前做一天7 天前
.netcore + postgis 保存地图围栏数据
.netcore·postgis·geometry·polygon
yz-俞祥胜7 天前
杨中科 .Net Core 笔记 DI 依赖注入2
笔记·.netcore
鸠摩智首席音效师8 天前
.NET Core 应用程序如何在 Linux 中创建 Systemd 服务 ?
linux·运维·.netcore
丨我是张先生丨8 天前
Windows VSCode .NET CORE WebAPI Debug配置
.netcore