当前位置: 首页 > news >正文

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 的鉴权和授权&#xff0c;可以在 ASP.NET Core 中手动生成、解析、验证 JWT Token。System.IdentityModel.Tokens.Jwt 提供了 JWT 的生成和解析的 API。以下是如何使用该库实现鉴权授权的详细步骤。 步骤 1: 安装 NuGe…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则&#xff1a; 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...

嵌入式软考学习笔记(1)超详细!!!

目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与&#xff1a;有0则0&#xff0c;全1才1 或&#xff1a;有1则1&#xff0c;全0才0 异或&#xff1a;相同为0…...

【数据分享】2013-2023年我国省市县三级的逐年CO数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2023年的省市县三级的逐年PM2.5数据、2000-2023年的省市县三级的逐年PM10数据、2013-2023年的省市县三级的逐年SO2数据、2000-2023年省市县三级的逐年O3数据和2008-2023年我国省市县三级的逐…...

C# 探险之旅:第十六节 - 整数类型:与八位数字精灵的奇幻舞会

嘿&#xff0c;勇敢的探险家们&#xff01;欢迎再次踏上C#编程的奇幻之旅。今天&#xff0c;我们将进入一个充满魔法与数字的世界——整数类型的王国。想象一下&#xff0c;你站在一个华丽的舞池中&#xff0c;周围是八位身着华丽舞裙&#xff08;其实是二进制位啦&#xff09;…...

Cleo文件传输软件存在任意文件读取漏洞(CVE-2024-50623)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

Java 小抄|解析 JSON 并提取特定层级数据

文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中&#xff0c;我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据&#xff0c;并通过流式处理提取特定层级的数据。我们将…...

活动报名:Voice Agent 开发者分享会丨RTE Meetup

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

DOA估计算法——ESPRIT算法

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

CEF 数据加密与网络安全

随着网络攻击的日益猖獗&#xff0c;确保应用的安全性已经成为开发者的首要任务。特别是在现代Web应用中&#xff0c;如何确保数据的加密存储、网络通信的安全性以及有效的认证机制成为至关重要的问题。对于基于 Chromium Embedded Framework (CEF) 的应用&#xff0c;开发者必…...

go build command

文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令&#xff0c;它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…...

理解音频采样率和transformer模型:给Python小白的简单解释

理解音频采样率和transformer模型&#xff1a;给Python小白的简单解释 引言什么是采样率&#xff1f;举个例子有趣的现象Python小实验总结 引言 大家好&#xff01;今天我们来聊一个有趣的话题&#xff1a;音频采样率和AI模型。不要被这些专业术语吓到&#xff0c;我会用最简单…...

【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…...

大模型qiming面试内容整理-系统设计与架构

在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端&#xff0c;都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100&#xff0c;即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.&#xff0c;显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件&#xff0c;删除Fir…...

firewall

firewall 如果系统使用 firewalld 作为防火墙管理工具&#xff0c;可以使用以下命令&#xff1a; 查看防火墙是否运行&#xff1a; systemctl status firewalld查看防火墙的状态&#xff08;简洁输出&#xff09;&#xff1a; firewall-cmd --state输出示例&#xff1a; r…...

XSS(跨站攻击)

XSS漏洞&#xff08;跨站脚本&#xff09; 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从…...

Tomcat添加各种响应头 X-Download-Options、Permissions-Policy等

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 最近部署的项目被绿盟扫出来很多web漏洞,其中tomcat响应占了很大一部分。下面我们整理一下如何处理。 首先说说常见…...

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket&#xff08;应用程序之间的通讯保障&#xff09; 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1&#xff1a;ServerSocket和Socket有什么关系&#xff1f; 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 中使…...

Win11Debloat:让你的Windows系统告别臃肿,重获极速体验的完整指南

Win11Debloat&#xff1a;让你的Windows系统告别臃肿&#xff0c;重获极速体验的完整指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other chang…...

Navicat Mac终极重置指南:3种简单方法快速恢复试用期

Navicat Mac终极重置指南&#xff1a;3种简单方法快速恢复试用期 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你是否正在使…...

2026 毕业季 AI 论文工具硬核横评:从初稿到定稿,9 款神器帮你告别熬夜焦虑

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 引言&#xff1a;毕业季论文困局&#xff0c;AI 工具成破局关键 又到一年毕业季&#xff0c;本科毕业论文成为无…...

110页PPT的大数据产品设计和应用,含整体方案和多个行业案例,满分PPT

&#x1f4d8;【文档介绍】&#x1f310;《大数据应用型产品设计方法及行业案例介绍》PPT共110页可编辑文档&#xff0c;它将是你招投标、行业解决方案的重要参考资料。 &#x1f511;【掌握大数据&#xff0c;引领企业未来】 作为企业管理者&#xff0c;需要的不仅是管理智慧&…...

AI智能体开发(一):从概念到架构设计

定义与核心特征 AI智能体(AI Agent)是一种能够自主感知环境、做出决策并执行行动的AI系统。 与传统AI模型不同,Agent不仅仅是被动地"回答问题",而是能够主动地"完成任务"。它像一个智能助手,能够理解你的目标,规划执行步骤,调用各种工具,最终交付…...

ZVM嵌入式实时虚拟机:在ARMv8-A上实现Linux与Zephyr的混合关键性系统

1. 项目概述与核心价值如果你正在从事嵌入式系统开发&#xff0c;尤其是涉及汽车电子、工业控制或5G通信设备这类对实时性和可靠性要求极高的领域&#xff0c;那么你肯定对“既要、又要、还要”的困境深有体会。我们常常需要在同一块硬件上&#xff0c;既要运行一个功能丰富、生…...

5分钟极速上手:B站视频转文字工具bili2text完整指南

5分钟极速上手&#xff1a;B站视频转文字工具bili2text完整指南 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理B站视频内容而烦恼吗&#xff1f;每…...

终极Android动漫播放器插件:Hanime1Plugin完全使用指南

终极Android动漫播放器插件&#xff1a;Hanime1Plugin完全使用指南 【免费下载链接】Hanime1Plugin Android插件(https://hanime1.me) (NSFW) 项目地址: https://gitcode.com/gh_mirrors/ha/Hanime1Plugin 想要在Android设备上获得完美的动漫观影体验吗&#xff1f;Hani…...

网络工程师面试必看:通过一个华为ENSP综合实验,拆解中小型网络规划的核心思路

网络工程师面试必看&#xff1a;中小型网络规划的设计思维与实战解析 当面试官抛出"请描述你如何设计一个中小型网络"这个问题时&#xff0c;大多数求职者会陷入两种极端&#xff1a;要么机械罗列配置命令&#xff0c;要么泛泛而谈架构概念。真正能打动面试官的&…...

APK Installer:在Windows上轻松安装Android应用的完整指南

APK Installer&#xff1a;在Windows上轻松安装Android应用的完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK Installer是一款专为Windows系统设计的Andro…...