安全门禁——JWT 身份验证与授权实战合集 - .NET 8 现代Web开发实战指南(7)1..NET 8 Web开发入门(一):启程——.NET生态全景与开发环境构建05-052..N
前言给 API 装个“门禁卡”在前面的文章里我们的 Todo API 就像一栋没有大门的房子任何人都可以随意进出调用接口。这在企业级应用中是绝对不允许的。我们需要一套机制认证你是谁查验身份证授权你能干什么查看权限列表在前后端分离的架构中JWT (JSON Web Token)是目前最流行的认证方案。它就像一张“电子门禁卡”。用户登录成功后服务器发给他一张卡Token以后每次请求都要带着这张卡服务器只需验证卡的真伪而不需要每次都去查数据库。二、JWT 到底是什么刚子不喜欢背书你只需要理解三个核心点一个 JWT 就是一个很长的字符串长得像这样eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuWkp...它由三部分组成用.分隔Header头说明这是什么卡用什么加密算法。Payload载荷重点。里面存着用户信息如用户ID、用户名、角色。注意这里的数据只是 Base64 编码不要存密码Signature签名核心安全层。服务器用只有自己知道的密钥对前两部分进行签名。黑客如果篡改了 Payload签名就对不上了服务器会直接拒绝。三、实战准备安装 NuGet 包在项目中安装以下 NuGet 包dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer这会引入处理 JWT 验证的核心中间件。四、第一步打造“发卡处”用户登录时我们需要核实账号密码然后生成 Token 发给他。为了演示方便我们假设有一个模拟的用户库。4.1 定义配置模型和模拟用户在Program.cs顶部定义模型// 定义用户模型 public class User { public string Username { get; set; } public string Password { get; set; } // 实际项目中应存储哈希值 public string Role { get; set; } // 角色Admin, User } // 模拟数据库用户 public static class UserStore { public static ListUser Users new ListUser { new User { Username admin, Password 123456, Role Admin }, new User { Username gangzi, Password 123456, Role User } }; }4.2 编写登录接口这个接口负责“发卡”。using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; // ... builder 配置 ... app.MapPost(/login, (User login) { // 1. 验证账号密码 var user UserStore.Users.FirstOrDefault(u u.Username login.Username u.Password login.Password); if (user null) { return Results.Unauthorized(); // 401 未授权 } // 2. 创建 Claims声明 - 也就是 Payload 里要存的数据 var claims new ListClaim { new Claim(ClaimTypes.Name, user.Username), new Claim(ClaimTypes.Role, user.Role), // 存入角色用于授权 new Claim(MyCustomClaim, SomeData) // 也可以存自定义数据 }; // 3. 生成签名密钥实际项目中应从 appsettings.json 读取 // 密钥至少要 16 个字符 var secretKey This_Is_A_Very_Secret_Key_For_JWT_2026!; var key new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); var creds new SigningCredentials(key, SecurityAlgorithms.HmacSha256); // 4. 生成 Token var token new JwtSecurityToken( issuer: MyTodoApp, // 签发者 audience: MyTodoAppUsers, // 接收者 claims: claims, expires: DateTime.Now.AddHours(1), // 过期时间1小时 signingCredentials: creds ); var tokenString new JwtSecurityTokenHandler().WriteToken(token); return Results.Ok(new { Token tokenString }); });刚子敲黑板 这里的secretKey是服务器的“底牌”。绝对不能泄露如果黑客拿到了这个 Key他就能伪造任意用户的 Token。在生产环境中一定要放在appsettings.json或环境变量里并且长度要足够长。五、第二步配置“安检门”有了发卡的逻辑还需要配置中间件让系统自动验证每个请求带来的 Token。5.1 注册认证与授权服务在Program.cs的builder.Services部分添加// 注册认证服务 builder.Services.AddAuthentication(options { options.DefaultAuthenticateScheme JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options { // 配置 Token 验证参数 options.TokenValidationParameters new TokenValidationParameters { ValidateIssuer true, ValidateAudience true, ValidateLifetime true, ValidateIssuerSigningKey true, ValidIssuer MyTodoApp, ValidAudience MyTodoAppUsers, IssuerSigningKey new SymmetricSecurityKey(Encoding.UTF8.GetBytes(This_Is_A_Very_Secret_Key_For_JWT_2026!)) }; }); // 注册授权服务 builder.Services.AddAuthorization();5.2 启用中间件在app.Build()之后确保顺序正确UseAuthentication必须在UseAuthorization之前。var app builder.Build(); app.UseAuthentication(); // 开启认证识别身份 app.UseAuthorization(); // 开启授权检查权限 // ... 其他中间件 ...六、第三步保护你的 API现在安检门装好了我们给之前的 Todo 接口加上“锁”。6.1 普通保护登录才能访问在 Minimal API 中使用RequireAuthorization()扩展方法。// 只有带了有效 Token 才能访问 app.MapGet(/todos, async (AppDbContext db) { return await db.Todos.ToListAsync(); }).RequireAuthorization();6.2 角色保护管理员才能删除假设删除操作只有 Admin 角色才能执行。app.MapDelete(/todos/{id}, async (int id, AppDbContext db) { // ... 删除逻辑 ... return Results.NoContent(); }).RequireAuthorization(Admin); // 这是错误的写法修正Minimal API 的角色授权需要配合策略或者简写为// 正确写法定义一个策略或者使用 Claims app.MapDelete(/todos/{id}, async (int id, AppDbContext db) { // ... 删除逻辑 ... }).RequireAuthorization(policy policy.RequireRole(Admin));七、实战测试完整流程演示让我们用 Postman 或 Swagger 演示整个流程。场景一未登录直接访问访问GET /todos。结果401 Unauthorized。系统拒绝访问。场景二登录获取 Token访问POST /loginBody 传入{username: admin, password: 123456}。结果返回一个 JSON包含 Token 字符串。

相关新闻

vTaskDelayUntil与vTaskDelay函数区别

vTaskDelayUntil与vTaskDelay函数区别

区别不在“是不是都用 xTaskGetTickCount()”,而在 延时的参考点 不一样。 vTaskDelay() 是“从现在开始再等一段时间”。 比如: vTaskDelay(10); 意思是: 从当前调用这一刻起,阻塞 10 个 tick 所以如果你的任务里前面的处理时间忽长忽短,周期会漂。 vTaskDelayUnti…

2026/6/28 2:08:12阅读更多 →
Postman 完整使用教程:接口调试、集合、环境变量

Postman 完整使用教程:接口调试、集合、环境变量

Postman是接口测试入门必备工具,轻量化、零代码、功能全面,适配日常接口调试、批量测试、简单自动化。本文手把手讲解Postman核心功能、实操步骤、企业常用用法,零基础快速上手。一、Postman核心功能介绍支持HTTP/HTTPS接口调试、多种请求方式…

2026/6/28 2:08:12阅读更多 →
新版Dash中的websocket型回调

新版Dash中的websocket型回调

在Dash应用中使用websocket型回调# 首先,我们需要在应用实例化对应的dash.Dash()中设置参数backend"fastapi",这是令Dash应用底层完美开启websocket通信的必要前提。 app dash.Dash(__name__, backend"fastapi")在此基础上&#…

2026/6/28 2:08:12阅读更多 →
Linux网络核心知识+bonding主备模式配置

Linux网络核心知识+bonding主备模式配置

本文旨在用最通俗易懂的方式,梳理 Linux 网络管理的核心知识体系。为了方便理解,我将很多专业术语做了口语化处理,比如把“网络设备”说成“物理网卡”。这可能会让资深工程师觉得不够严谨,但我相信对刚接触这块内容的朋友来说&am…

2026/6/28 3:58:18阅读更多 →
HappyHorse-1.1 三大视频生成分支技术解析  API 中转站接入实战

HappyHorse-1.1 三大视频生成分支技术解析 API 中转站接入实战

一、HappyHorse-1.1 底层统一技术底座HappyHorse-1.1 为阿里云发布的 15B 参数视频生成大模型,全系共用40 层单流统一 Transformer架构,区别于市面 “先生画面、后配音” 的串联式模型。核心通用技术特性模态联合建模 文本、图像、视频帧、音频频谱统一编…

2026/6/28 3:58:18阅读更多 →
GitHub周趋势2026W26 | AI视频制作系统、DESIGN.md规范、System Prompts泄露、AWS Agent工具包

GitHub周趋势2026W26 | AI视频制作系统、DESIGN.md规范、System Prompts泄露、AWS Agent工具包

本周19个GitHub热门项目中,AI Agent工具占据12席,覆盖视频制作、代码理解、信息聚合、招聘评估、网络安全等方向,生态正从“能用”走向“用好”阶段。语言分布上,TypeScript(7个)领跑,Python(6个)紧随其后,…

2026/6/28 3:58:18阅读更多 →
仓库照明智能控制方案怎么设计?从灯具间距到控制策略的完整路径

仓库照明智能控制方案怎么设计?从灯具间距到控制策略的完整路径

仓库照明改造中,“灯装多少、间距多大”是第一步,但远不是全部。灯具间距决定了基础光环境,而真正让仓库照明从“够亮”变为“省电、好用、可管”的,是控制方案的设计。一、先算清楚:灯具间距决定控制回路怎么分灯具间…

2026/6/28 3:58:18阅读更多 →
清华、北大、港大:让AI管家彻底接管你的手机,比你更懂你的需求

清华、北大、港大:让AI管家彻底接管你的手机,比你更懂你的需求

这项由清华大学、北京大学和香港大学联合开展的研究,以技术报告形式于2026年6月22日发布于预印本平台arXiv,编号为arXiv:2606.23449。感兴趣的读者可通过该编号查阅完整论文。你有没有遇到过这样的时刻:想在网上比价买一双运动鞋,…

2026/6/28 3:58:18阅读更多 →
资源03:专栏全套配套文档模板汇总下载指南

资源03:专栏全套配套文档模板汇总下载指南

资源03:专栏全套配套文档模板汇总下载指南 一、本课学习目标 1、完整梳理专栏全部配套可复用文档清单,区分运维台账、项目交付、联调模板、复盘报告四大类。 2、明确各类模板适用场景、使用时机、交付归档要求,新项目、故障复盘、设备导入均可…

2026/6/28 3:53:18阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →