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 中使…...
QQ音乐加密格式解密完全指南:从原理到实践的全方位解决方案
QQ音乐加密格式解密完全指南:从原理到实践的全方位解决方案 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump …...
Youtu-Parsing快速部署指南:一键启动Web服务,5分钟开始解析文档
Youtu-Parsing快速部署指南:一键启动Web服务,5分钟开始解析文档 1. 引言:为什么选择Youtu-Parsing 在日常工作中,我们经常需要处理各种文档——合同、报告、表格、发票等。传统的手动录入方式不仅效率低下,还容易出错…...
终极指南:使用wger打造完全自托管的健身与营养追踪系统
终极指南:使用wger打造完全自托管的健身与营养追踪系统 【免费下载链接】wger Self hosted FLOSS fitness/workout, nutrition and weight tracker 项目地址: https://gitcode.com/GitHub_Trending/wg/wger wger是一个开源的、功能全面的健身与营养管理平台&…...
LAV Filters专业配置进阶指南:深度解析开源解码器架构与性能优化
LAV Filters专业配置进阶指南:深度解析开源解码器架构与性能优化 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters LAV Filters是一套基于FFmpeg的高…...
seo优化服务价格一般是多少_网站快速排名对网站访问量有什么影响
SEO优化服务价格一般是多少_网站快速排名对网站访问量有什么影响 在当前数字化经济的浪潮中,网站的流量和排名直接决定了企业的成功与否。SEO优化服务价格一般是多少?更重要的是,网站快速排名对网站访问量有什么影响呢?这两个问题…...
ipa 覆盖算法参数调优实战:从理论到可视化验证
1. IPA覆盖算法核心参数解析 在机器人路径规划领域,IPA覆盖算法因其高效性和适应性被广泛应用。这个算法的核心在于几个关键参数的协同作用,它们直接影响着机器人的覆盖路径质量和执行效率。让我们先来认识这些"幕后操控者": cover…...
造相-Z-Image代码实例:Streamlit双栏UI自定义参数调节逻辑解析
造相-Z-Image代码实例:Streamlit双栏UI自定义参数调节逻辑解析 1. 项目概述 造相-Z-Image是一个基于通义千问官方Z-Image模型的本地轻量化文生图系统,专门为RTX 4090显卡进行深度优化。该系统采用BF16高精度推理技术,具备显存极致防爆能力&…...
ChatTTS语音合成生产环境部署:负载均衡+API服务化封装实践
ChatTTS语音合成生产环境部署:负载均衡API服务化封装实践 1. 项目背景与价值 ChatTTS是目前开源领域最逼真的中文语音合成模型之一,专门针对对话场景进行了深度优化。与传统的TTS系统不同,ChatTTS能够自动生成极其自然的停顿、换气声、笑声…...
Lychee Rerank MM实战教程:自定义Instruction提升特定领域重排序效果
Lychee Rerank MM实战教程:自定义Instruction提升特定领域重排序效果 1. 快速了解Lychee Rerank MM Lychee Rerank MM是一个专门解决多模态检索问题的智能系统。想象一下这样的场景:你在电商平台搜索"红色连衣裙",系统返回了几十…...
AI核心概念解析:Agent、Prompt、Skill 及生态关系
🌐 AI核心概念解析:Agent、Prompt、Skill 及生态关系 一、关键名词正确定义与原理 1. Agent(智能体) 指具备感知—决策—行动闭环能力的自主软件实体。它不是单个模型,而是一个系统架构:接收输入&#x…...
