.Net Core使用JWT.net
.Net Core使用JWT.net
1.新建WebApi项目JwtDemo
2.通过nuget安装JWT.Net 根据你的版本自行选择合适的版本
3.分别建立三个实体类LoginDto,PlayloadDto,TokenDto
public class LoginDto {
public string UserId { get; set; }
public string Password { get; set; }
}
public class PlayloadDto {
public string UserId { get; set; }
public List Roles { get; set; }
public DateTime? ExpiryDateTime { get; set; }
}
public class TokenDto {
public bool Success { get; set; }
public string Token { get; set; }
public string Message { get; set; }
}
4.新建TokenController用于验证用户信息获取Token信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using JwtDemo.Dto;
using Microsoft.AspNetCore.Mvc;
using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using System.Text;
namespace JwtDemo.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class TokenController : Controller {
private const string secretKey = "sfdkjskdlfnnierljewlkjsffd";
[HttpPost]
public TokenDto GetToken(LoginDto loginDto) {
TokenDto tokenInfo = new TokenDto();
if (loginDto.UserId=="1646" && loginDto.Password == "123456") {
PlayloadDto playloadDto = new PlayloadDto() { UserId = loginDto.UserId, Roles = new List {"1001"}, ExpiryDateTime = DateTime.Now.AddMinutes(30) };
try {
byte[] key = Encoding.UTF8.GetBytes(secretKey);
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();//加密方式
IJsonSerializer serializer = new JsonNetSerializer();//序列化
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();//base64加解密
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
var token = encoder.Encode(playloadDto, key);//生成令牌
tokenInfo.Success = true;
tokenInfo.Token = token;
tokenInfo.Message = "ok";
}
catch(Exception e) {
tokenInfo.Success = false;
tokenInfo.Message = e.InnerException.ToString();
}
}
return tokenInfo;
}
}
}
得到相应的token信息
5.新建过滤器ApiAuthorityAttribute 用于验证token信息的正确性
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using JWT;
using JWT.Serializers;
using JwtDemo.Dto;
using JwtDemo.Common;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using JWT.Algorithms;
using System.Text;
using Microsoft.AspNetCore.Mvc;
namespace JwtDemo.Filter {
public class ApiAuthorityAttribute : Attribute, IAuthorizationFilter {
private const string secretKey = "sfdkjskdlfnnierljewlkjsffd";
public void OnAuthorization(AuthorizationFilterContext context) {
var controller = context.RouteData.Values["controller"].ToString();
var action = context.RouteData.Values["action"].ToString();
var httpcontext = ServiceGetter.ServiceProvider.GetRequiredService().HttpContext;
//取得header中的auth的token信息
var authHeader = from t in httpcontext.Request.Headers where t.Key == "auth" select t.Value.FirstOrDefault();
if (authHeader != null) {
try {
string token = authHeader.FirstOrDefault();
byte[] key = Encoding.UTF8.GetBytes(secretKey);
IJsonSerializer serializer = new JsonNetSerializer();//序列化
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();//base64加解密
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();//加密方式
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
//解密
var json = decoder.DecodeToObject(token, key, verify: true);
if(json != null) {
if (json.ExpiryDateTime < DateTime.Now) {
httpcontext.Response.WriteAsync("0你的Token验证不通过");
context.Result = new EmptyResult();//加入此句代码就不会继续执行action
return;
}
}
}
catch(Exception e) {
context.Result = new EmptyResult();//加入此句代码就不会继续执行action
return;
}
}
}
}
}
6.将此过滤器应用到api接口上,将获取到的token信息放到header中键值为auth项中,然后发送请求,就可以通过此过滤器验证了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构