ASP.NET Core WebAPI中使用Jwt实现鉴权授权-System.IdentityModel.Tokens.Jwt
使用 System.IdentityModel.Tokens.Jwt
直接实现基于 JWT 的鉴权和授权,可以在 ASP.NET Core 中手动生成、解析、验证 JWT Token。System.IdentityModel.Tokens.Jwt
提供了 JWT 的生成和解析的 API。以下是如何使用该库实现鉴权授权的详细步骤。
步骤 1: 安装 NuGet 包
确保安装了以下包来使用 JWT:
dotnet add package System.IdentityModel.Tokens.Jwt
步骤 2: 生成 JWT Token
使用 JwtSecurityTokenHandler
来生成 JWT Token。一般情况下,会在用户登录成功后生成 Token 并返回给客户端。
生成 Token 的代码示例:
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;public class JwtTokenService
{private readonly IConfiguration _configuration;public JwtTokenService(IConfiguration configuration){_configuration = configuration;}public string GenerateToken(string username){// 从配置中读取密钥var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSettings:Secret"]));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);// 定义 Token 的声明(可以存储用户的标识信息)var claims = new[]{new Claim(JwtRegisteredClaimNames.Sub, username),new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())// 可以添加更多的自定义声明,如角色等};// 创建 Tokenvar token = new JwtSecurityToken(issuer: _configuration["JwtSettings:Issuer"],audience: _configuration["JwtSettings:Audience"],claims: claims,expires: DateTime.Now.AddMinutes(120), // 设置过期时间signingCredentials: creds);// 生成 JWT 并返回return new JwtSecurityTokenHandler().WriteToken(token);}
}
步骤 3: 验证 JWT Token
客户端在请求时会携带 JWT Token(通常在 HTTP 请求的 Authorization
头中),服务器端需要验证 Token 的有效性。在验证 JWT 时,我们可以使用 JwtSecurityTokenHandler.ValidateToken
方法。
验证 Token 的代码示例:
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Text;public class JwtTokenValidator
{private readonly IConfiguration _configuration;public JwtTokenValidator(IConfiguration configuration){_configuration = configuration;}public ClaimsPrincipal ValidateToken(string token){var tokenHandler = new JwtSecurityTokenHandler();var key = Encoding.UTF8.GetBytes(_configuration["JwtSettings:Secret"]);try{// 验证 Token 的参数设置var validationParameters = new TokenValidationParameters{ValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(key),ValidateIssuer = true,ValidateAudience = true,ValidIssuer = _configuration["JwtSettings:Issuer"],ValidAudience = _configuration["JwtSettings:Audience"],ValidateLifetime = true, // 验证 Token 是否过期ClockSkew = TimeSpan.Zero // 不允许时间偏差};// 验证 Token 并返回解析后的 ClaimsPrincipalvar principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);// 验证通过返回解析后的 Token 信息return principal;}catch (Exception){// 验证失败,返回 nullreturn null;}}
}
步骤 4: 使用 JWT 鉴权授权
在 ASP.NET Core 中集成 JWT 鉴权时,通常会在 HTTP 请求的 Authorization
头中传递 Token,格式为 Bearer <Token>
。如果你要手动处理 Token 的验证,可以在控制器或中间件中直接调用 JwtTokenValidator
类来验证 Token。
客户端请求的示例:
GET /api/protected/data HTTP/1.1
Host: yourdomain.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
在控制器中使用手动验证 Token:
[ApiController]
[Route("api/[controller]")]
public class ProtectedController : ControllerBase
{private readonly JwtTokenValidator _tokenValidator;public ProtectedController(JwtTokenValidator tokenValidator){_tokenValidator = tokenValidator;}[HttpGet("data")]public IActionResult GetProtectedData(){var token = Request.Headers["Authorization"].ToString().Replace("Bearer ", "");// 验证 Token 的有效性var principal = _tokenValidator.ValidateToken(token);if (principal == null){// Token 无效或验证失败return Unauthorized(new { message = "Invalid Token" });}// 返回受保护的数据return Ok(new { message = "This is protected data", user = principal.Identity.Name });}
}
步骤 5: 添加授权逻辑
在 JWT Token 中,可以加入自定义的 Claim
,如角色或权限,之后根据这些 Claim
执行角色或权限的授权检查。
添加角色到 JWT:
在生成 JWT 时,可以添加角色到 Token 中:
var claims = new[]
{new Claim(JwtRegisteredClaimNames.Sub, username),new Claim(ClaimTypes.Role, "Admin"), // 添加角色信息new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
根据角色进行授权:
在验证 Token 后,你可以通过检查 ClaimsPrincipal
中的角色来决定是否授权用户访问某些资源。
public IActionResult GetAdminData()
{var token = Request.Headers["Authorization"].ToString().Replace("Bearer ", "");var principal = _tokenValidator.ValidateToken(token);if (principal == null){return Unauthorized(new { message = "Invalid Token" });}// 检查用户是否拥有 Admin 角色if (!principal.IsInRole("Admin")){return Forbid(new { message = "You do not have access to this resource" });}// 返回管理员数据return Ok(new { message = "This is admin data" });
}
System.IdentityModel.Tokens.Jwt
提供了完整的 JWT 生成和验证功能,适用于手动处理 Token 逻辑的场景。
相关文章:
ASP.NET Core WebAPI中使用Jwt实现鉴权授权-System.IdentityModel.Tokens.Jwt
使用 System.IdentityModel.Tokens.Jwt 直接实现基于 JWT 的鉴权和授权,可以在 ASP.NET Core 中手动生成、解析、验证 JWT Token。System.IdentityModel.Tokens.Jwt 提供了 JWT 的生成和解析的 API。以下是如何使用该库实现鉴权授权的详细步骤。 步骤 1: 安装 NuGe…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)
目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则: 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...

嵌入式软考学习笔记(1)超详细!!!
目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与:有0则0,全1才1 或:有1则1,全0才0 异或:相同为0…...

【数据分享】2013-2023年我国省市县三级的逐年CO数据(免费获取\excel\shp格式)
空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2023年的省市县三级的逐年PM2.5数据、2000-2023年的省市县三级的逐年PM10数据、2013-2023年的省市县三级的逐年SO2数据、2000-2023年省市县三级的逐年O3数据和2008-2023年我国省市县三级的逐…...

C# 探险之旅:第十六节 - 整数类型:与八位数字精灵的奇幻舞会
嘿,勇敢的探险家们!欢迎再次踏上C#编程的奇幻之旅。今天,我们将进入一个充满魔法与数字的世界——整数类型的王国。想象一下,你站在一个华丽的舞池中,周围是八位身着华丽舞裙(其实是二进制位啦)…...
Cleo文件传输软件存在任意文件读取漏洞(CVE-2024-50623)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
Java 小抄|解析 JSON 并提取特定层级数据
文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中,我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据,并通过流式处理提取特定层级的数据。我们将…...

活动报名:Voice Agent 开发者分享会丨RTE Meetup
引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…...

DOA估计算法——ESPRIT算法
1 简介 ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)最早是由Roy等人于1986年提出,是一种广泛应用于高分辨率方向到达(DOA)估计和频率估计的子空间方法。其核心思想基于信号子空间的…...

CEF 数据加密与网络安全
随着网络攻击的日益猖獗,确保应用的安全性已经成为开发者的首要任务。特别是在现代Web应用中,如何确保数据的加密存储、网络通信的安全性以及有效的认证机制成为至关重要的问题。对于基于 Chromium Embedded Framework (CEF) 的应用,开发者必…...
go build command
文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令,它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…...
理解音频采样率和transformer模型:给Python小白的简单解释
理解音频采样率和transformer模型:给Python小白的简单解释 引言什么是采样率?举个例子有趣的现象Python小实验总结 引言 大家好!今天我们来聊一个有趣的话题:音频采样率和AI模型。不要被这些专业术语吓到,我会用最简单…...
【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
大模型qiming面试内容整理-系统设计与架构
在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...

Mac/Windows端长期破解myBase8方法(无需安装火绒)
提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...
firewall
firewall 如果系统使用 firewalld 作为防火墙管理工具,可以使用以下命令: 查看防火墙是否运行: systemctl status firewalld查看防火墙的状态(简洁输出): firewall-cmd --state输出示例: r…...
XSS(跨站攻击)
XSS漏洞(跨站脚本) 1.XSS 漏洞简介 XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从…...
Tomcat添加各种响应头 X-Download-Options、Permissions-Policy等
AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 最近部署的项目被绿盟扫出来很多web漏洞,其中tomcat响应占了很大一部分。下面我们整理一下如何处理。 首先说说常见…...

搭建Tomcat(一)---SocketServerSocket
目录 引入1 引入2--socket 流程 Socket(应用程序之间的通讯保障) 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1:ServerSocket和Socket有什么关系? ServerSocket Soc…...
ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小
ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小 文章目录 ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小1. 安装 Times New Roman 字体验证字体是否安装成功 2. 在 Matplotlib 中加载 Times New Roman 字体3. 在 Matplotlib 中使…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...