一、JWT概述

JSON Web Token(JWT)是一种轻量级的身份认证机制,广泛应用于分布式系统中的用户认证。它通过紧凑的JSON格式存储用户身份信息,并使用数字签名确保信息的完整性和真实性。与传统的基于Session的认证相比,JWT具有无状态、可扩展、跨平台等优势,特别适合于微服务架构和前后端分离的应用场景。

JWT的核心优势在于:

  • 无状态:服务器不需要存储会话信息,减轻服务器负担

  • 跨平台:基于标准JSON格式,可在不同语言和平台间传递

  • 自包含:令牌包含所有必要的用户信息,减少数据库查询

  • 可扩展:支持自定义声明,满足不同业务需求

  • 安全性:通过数字签名确保信息不被篡改

二、JWT工作原理

JWT认证的核心流程如下:

  1. 用户登录:用户提供用户名和密码进行登录

  2. 生成Token:服务器验证成功后,生成包含用户身份信息的JWT令牌

  3. 返回Token:服务器将JWT令牌返回给客户端

  4. 存储Token:客户端存储JWT令牌(通常存储在localStorage或Cookie中)

  5. 请求携带Token:客户端后续请求时,在HTTP头部携带JWT令牌

  6. 验证Token:服务器验证JWT令牌的有效性(签名验证、过期时间检查等)

  7. 处理请求:验证通过后,服务器处理请求并返回结果

JWT认证流程图

+----------+     登录请求      +----------+
|          | -------------->  |          |
| 客户端   |                   | 服务器   |
|          | <--------------  |          |
+----------+   返回JWT令牌     +----------+|                                 ||   携带JWT令牌的请求               || ----------------------------->  ||                                 || <-----------------------------  ||        处理后的响应               |v                                 v

三、JWT结构组成

JWT令牌由三部分组成,用小数点(.)分隔,格式为Header.Payload.Signature:

1. Header(头部)

Header部分包含令牌类型(typ)和加密算法(alg),通常如下:

{"alg": "HS256","typ": "JWT"
}

其中,alg表示使用的加密算法(如HS256、RS256等),typ表示令牌类型。

2. Payload(载荷)

Payload部分包含用户身份信息和其他元数据,分为标准声明和自定义声明:

  • 标准声明

    • iss:令牌颁发者

    • sub:令牌主题(通常是用户ID)

    • aud:令牌受众

    • exp:令牌过期时间

    • iat:令牌颁发时间

    • nbf:令牌生效时间

    • jti:令牌唯一标识符

  • 自定义声明:根据业务需求定义的字段,如用户角色、权限等。

示例:

{"sub": "1234567890","name": "John Doe","role": "admin","exp": 1678900000
}

3. Signature(签名)

Signature部分是对Header和Payload的签名,用于验证令牌的完整性和真实性。服务器使用Header中指定的算法,结合密钥对Header和Payload进行签名:

PlainText
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secretKey
)

四、C#中实现JWT认证

1. 安装必要的包

在C#项目中,我们需要安装以下NuGet包:

  • System.IdentityModel.Tokens.Jwt:用于生成和验证JWT令牌

  • Microsoft.AspNetCore.Authentication.JwtBearer:提供JWT身份验证中间件

Install-Package System.IdentityModel.Tokens.Jwt
Install-Package Microsoft.AspNetCore.
Authentication.JwtBearer

2. 配置JWT认证服务

在Program.cs文件中,添加JWT认证服务配置:

Program.cs 
using Microsoft.AspNetCore.Authentication.
JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
​
var builder = WebApplication.CreateBuilder(args);
​
// 添加JWT认证服务
builder.Services.AddAuthentication
(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true, // 验证颁发者ValidateAudience = true, // 验证受众ValidateLifetime = true, // 验证过期时间ValidateIssuerSigningKey = true, // 验证签名密钥ValidIssuer = builder.Configuration["Jwt:Issuer"], // 颁发者ValidAudience = builder.Configuration["Jwt:Audience"], // 受众IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])) // 签名密钥};});
​
// 添加授权服务
builder.Services.AddAuthorization();
​
var app = builder.Build();
​
// 使用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();
​
app.MapControllers();
app.Run();

3. 配置appsettings.json

在appsettings.json文件中添加JWT相关配置:

appsettings.json
应用
{"Jwt": {"Issuer": "YourIssuer","Audience": "YourAudience","SecretKey": "YourSecretKeyHereShouldBeLongEnough"},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*"
}

4. 生成JWT令牌

创建一个AuthController,实现用户登录和生成JWT令牌的功能:

AuthController.cs
​
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
​
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{private readonly IConfiguration _configuration;
​public AuthController(IConfiguration configuration){_configuration = configuration;}
​[HttpPost("login")]public IActionResult Login([FromBody] LoginRequest request){// 验证用户凭据(实际应用中应查询数据库)if (request.Username == "admin" && request.Password == "password"){// 创建用户声明var claims = new[]{new Claim(ClaimTypes.Name, request.Username),new Claim(ClaimTypes.Role, "admin"),new Claim(JwtRegisteredClaimNames.Sub, "1234567890"),new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())};
​// 生成对称安全密钥var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
​// 生成签名凭据var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
​// 创建JWT令牌var token = new JwtSecurityToken(issuer: _configuration["Jwt:Issuer"],audience: _configuration["Jwt:Audience"],claims: claims,expires: DateTime.Now.AddMinutes(30),signingCredentials: creds);
​// 返回JWT令牌return Ok(new{token = new JwtSecurityTokenHandler().WriteToken(token),expiration = token.ValidTo});}
​return Unauthorized();}
}
​
public class LoginRequest
{public string Username { get; set; }public string Password { get; set; }
}

5. 保护API端点

使用[Authorize]属性保护API端点,只有携带有效JWT令牌的请求才能访问:

ValuesController.cs
​
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
​
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ValuesController : ControllerBase
{[HttpGet]public IActionResult Get(){return Ok(new string[] { "value1", "value2" });}
​[HttpGet("{id}")][Authorize(Roles = "admin")]public IActionResult Get(int id){return Ok($"value {id}");}
}

五、JWT认证的注意事项

  1. 密钥安全:确保JWT密钥安全存储,避免硬编码在代码中

  2. 令牌过期时间:设置合理的令牌过期时间,平衡安全性和用户体验

  3. HTTPS传输:使用HTTPS协议传输JWT令牌,防止中间人攻击

  4. 令牌刷新机制:实现令牌刷新机制,避免用户频繁登录

  5. 敏感信息:不要在JWT中存储敏感信息,如密码等

  6. 权限控制:结合角色和权限声明,实现细粒度的访问控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92917.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92917.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92917.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate 使用详解

在现代的Java开发中&#xff0c;数据持久化是一个至关重要的环节。而在众多持久化框架中&#xff0c;Hibernate以其强大的功能和灵活性&#xff0c;成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法&#xff0c;希望能为广大开发者提供一些有…

【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)

基于 YOLO12 与 OpenCV 的实时点击目标跟踪系统 在计算机视觉领域&#xff0c;目标检测与跟踪是两个核心任务。本文将介绍一个结合 YOLO 目标检测模型与 OpenCV 跟踪算法的实时目标跟踪系统&#xff0c;该系统允许用户通过鼠标交互选择特定目标进行持续跟踪&#xff0c;支持多…

【数据库】 MySQL 表的操作详解

在 MySQL 数据库的日常开发与维护中&#xff0c;表的操作是最基础且最常用的部分。本文将从 创建表、查看表结构、修改表 以及 删除表 等方面进行详细讲解&#xff0c;并附上对应的 SQL 语句示例&#xff0c;方便在实际项目中直接应用。一、创建表 1.1 创建表语法 CREATE TABLE…

DiT: Transformer上的扩散模型

论文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代码和工程网页&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首个基于Transformer架构的扩散模型&#xff01;它在…

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

文章目录一、二叉查找树(BST)&#xff1a;不平衡二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高由一个例子总结索引的特点基于哈希表实现的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找树升级版的BST树&#xff1a;AVL 树四、…

ESP32入门开发·VScode空白项目搭建·点亮一颗LED灯

目录 1. 环境搭建 2. 创建项目 3. 调试相关介绍 4. 代码编写 4.1 包含头文件 4.2 引脚配置 4.3 设置输出电平 4.4 延时函数 4.5 调试 1. 环境搭建 默认已经搭建好环境&#xff0c;如果未搭建好可参考&#xff1a; ESP32入门开发Windows平台下开发环境的搭建…

ONLYOFFICE AI 智能体上线!与编辑器、新的 AI 提供商等进行智能交互

ONLYOFFICE AI 插件​迎来重要更新&#xff0c;带来了新功能和更智能的交互体验。随着 AI 智能体&#xff08;现为测试版&#xff09;的上线、带来更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已经成为功能强大的文档智能助理。 关于 ONLYOFFICE ONLYOFFICE 文档是多…

【C++进阶学习】第十一弹——C++11(上)——右值引用和移动语义

前言&#xff1a; 前面我们已经将C的重点语法讲的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出来了很多新的语法&#xff0c;其中有一些作用还是非常大的&#xff0c;今天我们就先来学习其中一个很重要的点——右值引用以及它所扩展的移动定义 目录 一、左值引用和…

【IoTDB】363万点/秒写入!IoTDB凭何领跑工业时序数据库赛道?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…

IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!

一、前言 当前研究领域在基于扩散模型的文本到图像生成技术方面取得了显著进展&#xff0c;尤其在视觉条件控制方面。然而&#xff0c;现有方法&#xff08;如ControlNet&#xff09;在组合多个视觉条件时存在明显不足&#xff0c;主要表现为独立控制分支在去噪过程中容易引入…

无人机遥控器教练模式技术要点

一、技术要点1.控制权仲裁机制&#xff1a;核心功能&#xff1a;清晰定义主控权归属逻辑&#xff08;默认为学员&#xff0c;但教练随时可接管&#xff09;。切换方式&#xff1a;通常通过教练遥控器上的物理开关&#xff08;瞬时或锁定型&#xff09;或软件按钮触发。切换逻辑…

【跨服务器的数据自动化下载--安装公钥,免密下载】

跨服务器的数据自动化下载功能介绍&#xff1a;上代码&#xff1a;发现好久没写csdn了&#xff0c;说多了都是泪~~ 以后会更新一些自动化工作的脚本or 小tricks&#xff0c;欢迎交流。分享一个最近在业务上写的较为实用的自动化脚本&#xff0c;可以批量从远端服务器下载指定数…

C++-->stl: list的使用

前言list的认识list是可以在固定时间&#xff08;O&#xff08;1&#xff09;&#xff09;内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0…

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕

1. 实现功能 M4-1 接入 whisper ollama qwen3:14b 总结字幕 自动下载视频元数据如果有字幕&#xff0c;只下载字幕使用 ollama 的 qwen3:14b 对字幕内容进行总结 2.运行效果 source /root/anaconda3/bin/activate ytdlp &#x1f50d; 正在提取视频元数据… &#x1f4dd; 正在…

《Linux运维总结:Shell脚本高级特性之变量间接调用》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、变量间接调用 在Shell脚本中&#xff0c;变量间接调用是一种高级特性&#xff0c;它允许你通过另一个变量的值来动态地访问…

ABP VNext + Akka.NET:高并发处理与分布式计算

ABP VNext Akka.NET&#xff1a;高并发处理与分布式计算 &#x1f680; 用 Actor 模型把高并发写入“分片→串行化”&#xff0c;把锁与竞态压力转回到代码层面的可控顺序处理&#xff1b;依托 Cluster.Sharding 横向扩容&#xff0c;Persistence 宕机可恢复&#xff0c;Strea…

[激光原理与应用-250]:理论 - 几何光学 - 透镜成像的优缺点,以及如克服缺点

透镜成像是光学系统中应用最广泛的技术&#xff0c;其通过折射原理将物体信息转换为图像&#xff0c;但存在像差、环境敏感等固有缺陷。以下是透镜成像的优缺点及针对性改进方案&#xff1a;一、透镜成像的核心优点高效集光能力透镜通过曲面设计将分散光线聚焦到一点&#xff0…

测试匠谈 | AI语音合成之大模型性能优化实践

「测试匠谈」是优测云服务平台倾心打造的内容专栏&#xff0c;汇集腾讯各大产品的顶尖技术大咖&#xff0c;为大家倾囊相授开发测试领域的知识技能与实践&#xff0c;让测试工作变得更加轻松高效。 本期嘉宾介绍 Soren&#xff0c;腾讯TEG技术事业群质量工程师&#xff0c;负责…

用天气预测理解分类算法-从出门看天气到逻辑回归

一、生活中的决策难题&#xff1a;周末郊游的「天气判断」 周末计划郊游时&#xff0c;你是不是总会打开天气预报反复确认&#xff1f;看到 "25℃、微风、无雨" 就兴奋收拾行李&#xff0c;看到 "35℃、暴雨" 就果断取消计划。这个判断过程&#xff0c;其…

HTTPS服务

HTTPS服务 一、常见的端口 http ------ 80 明文 https ------ 443 数据加密 dns ------ 53 ssh ------ 22 telent ------ 23 HTTPS http ssl或者tls &#xff08;安全模式&#xff09; 二、原理&#xff1a; c&#xff08;客户端…