【C#】.Net Framework框架使用JWT

news2025/1/12 10:33:47

2023年,第31周,第2篇文章。给自己一个目标,然后坚持总会有收货,不信你试试!
本篇文章主要简单讲讲,.Net Framework框架下使用JWT的代码例子,以及他们的基本概念。
2002年微软发布了.net framework 1.0,那个时候博主刚开始玩传奇游戏,接触电脑的时间还是挺早的。

目录

  • 1、什么是JWT
  • 1.1、头部(Header)
  • 1.2、载荷(Payload)
  • 1.3、签名(Signature)
    • 1.4、JWT工作流程
    • 1.5、JWT优点
    • 1.6、JWT缺点
  • 2、Framework框架
    • 2.1、版本历时
  • 3、JWT代码实现
    • 3.1、引入库
    • 3.2、导入命名空间
  • 3.3、生成JWT代码
  • 3.4、验证JWT代码

在这里插入图片描述

1、什么是JWT

JWT(JSON Web Token)是一种开放的、自包含的标准,用于在网络应用间传输信息。
它基于JSON(JavaScript Object Notation)格式,并使用数字签名或加密来验证消息的完整性和真实性。

JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

1.1、头部(Header)

包含描述JWT的元数据,例如所使用的加密算法和类型(通常是JWT)。

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

1.2、载荷(Payload)

包含具体的数据,也可以添加自定义的声明(Claim),如用户名、角色、过期时间等。

{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022
}

1.3、签名(Signature)

由头部和载荷组成,并使用私钥(或对称密钥)进行签名,确保数据的完整性和真实性。

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

1.4、JWT工作流程

1)客户端提供有效的凭证(如用户名和密码)进行身份验证请求。
2)服务器进行身份验证,并返回带有有效签名的JWT给客户端。
3)客户端在后续请求中使用该JWT,通过解析和验证JWT,服务器可以确定请求的发起者身份和权限。

1.5、JWT优点

1)自包含性
JWT包含了身份验证和授权所需的所有信息,减轻了服务器存储状态的负担。
2)松散耦合
JWT可用于不同的平台和服务之间的身份验证和授权,具有良好的兼容性。
3)可扩展性
可以自定义声明来存储额外的数据。
4)安全性
JWT的签名可以确保数据的完整性和真实性。

1.6、JWT缺点

1)无法撤销
一旦 JWT 被签发,就无法撤销或使其失效,除非将密钥从客户端强制撤销或更改。因此,如果需要撤销令牌,JWT 不是一个合适的选择。
2)体积较大
JWT 包含了头部、载荷和签名,在网络传输中占用的空间相对较大。尽管可以对 JWT 进行压缩,但仍然比一些其他的验证机制更加臃肿。
3)敏感信息存储
JWT 默认存储在客户端,通常存储在浏览器的本地存储(如 LocalStorage 或 Cookie)中。这使得 JWT 脆弱,因为它容易受到 XSS 攻击的影响。因此,不建议将敏感信息存储在 JWT 的载荷中。

需要注意的是,由于JWT是基于Base64编码的,因此它并不是加密的。所以在使用JWT时,不要在其载荷中存储敏感信息,如密码或银行卡号等。

总结起来,JWT是一种轻量级、安全的身份验证和授权解决方案,其简单的结构和可扩展性使其成为当今Web应用程序中常用的身份验证标准之一。

2、Framework框架

2.1、版本历时

.NET Framework 是微软开发的一个应用程序开发框架,提供了开发和运行各种类型应用程序所需的库、工具和运行时环境。下面是.NET Framework 各个主要版本的历时情况:

编号版本发布时间备注
1.NET Framework 1.0发布于2002年2月这是最早的.NET Framework 版本,提供了基本的库和运行时环境,用于支持开发和运行应用程序。
2.NET Framework 1.1发布于2003年4月这个版本是对 .NET Framework 1.0 的升级,增加了一些新功能和修复了一些问题。
3.NET Framework 2.0发布于2005年11月这是一个重大的版本升级,引入了许多新的功能,如可编程的 Windows Forms 控件、提供可视化设计的 Web 服务、增强的数据访问和 XML 处理支持等。
4.NET Framework 3.0发布于2006年11月实际上,.NET Framework 3.0 并未引入新的运行时,而是在 .NET Framework 2.0 基础上添加了一组新的功能。
5.NET Framework 3.5发布于2007年11月这是对 .NET Framework 3.0 的升级,引入了一些新的特性和改进,如 LINQ (Language Integrated Query)、ABM (ASP.NET AJAX) 等。
6.NET Framework 4.0发布于2010年4月这是一个又一个重大版本升级,引入了大量的新功能和改进,如支持并行计算、新的编译器、Entity Framework 4.0、改进的 WCF 和 WPF 等。
7.NET Framework 4.5发布于2012年8月这是 .NET Framework 4.0 的升级版,引入了一些新的特性和改进,如异步编程模型 (async/await)、改进的 GC (垃圾回收器)、桌面应用程序的改进等。
8.NET Framework 4.6发布于2015年7月这是 .NET Framework 4.5 的升级版,引入了一些新的特性和改进,如 RyuJIT (即时编译器)、改进的 WPF、改进的 ASP.NET 等。
9.NET Framework 4.7发布于2017年4月这是 .NET Framework 4.6 的升级版,引入了一些新的特性和改进。
10.NET Framework 4.8发布于2019年4月这是 .NET Framework 4.7 的升级版,引入了一些新的特性和改进。

需要注意的是,自.NET Framework 4.5起,微软改变了发布策略,不再单独发布全新的框架版本,而是通过积累更新 (Cumulative Updates) 来提供新功能和改进,以确保开发者可以更加轻松地升级和迁移。

此外,需要注意的是,自 .NET Framework 4.8 起,微软正逐渐停止对传统的.NET Framework 的更新,并推荐开发者使用更加开放和跨平台的 “.NET” 系列产品,如 .NET Core 和 .NET 5+。

3、JWT代码实现

在C# .NET Framework中使用JWT(JSON Web Token)插件来处理身份验证和授权,
你可以使用提供JWT支持的第三方库,如System.IdentityModel.Tokens.Jwt
这个库是.NET Framework的一部分,可以用于创建和验证JWT。

下面使用System.IdentityModel.Tokens.Jwt库生成和验证JWT

3.1、引入库

首先,确保你的项目引用了System.IdentityModel.Tokens.Jwt库。

3.2、导入命名空间

导入所需的命名空间:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

3.3、生成JWT代码

使用以下代码生成JWT:

// 设置JWT的密钥
string secretKey = "your_secret_key";
byte[] keyBytes = Encoding.UTF8.GetBytes(secretKey);
var securityKey = new SymmetricSecurityKey(keyBytes);

// 创建JWT的签名凭证
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

// 设置JWT的Claims
var claims = new[]
{
   new Claim(ClaimTypes.Name, "John Doe"),
   new Claim(ClaimTypes.Email, "john.doe@example.com"),
   // 添加其他需要的声明
};

// 创建JWT的Token
var token = new JwtSecurityToken(
   issuer: "your_issuer",
   audience: "your_audience",
   claims: claims,
   expires: DateTime.Now.AddDays(1),
   signingCredentials: signingCredentials
);

// 生成JWT字符串
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);

3.4、验证JWT代码

使用以下代码验证JWT:

// 验证JWT的密钥
var tokenValidationParameters = new TokenValidationParameters
{
   ValidateIssuer = true,
   ValidateAudience = true,
   ValidateIssuerSigningKey = true,
   IssuerSigningKey = securityKey,
   ValidIssuer = "your_issuer",
   ValidAudience = "your_audience"
};

// 验证JWT字符串
var claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(jwtToken, tokenValidationParameters, out _);

请注意,上述示例中的"your_secret_key"、"your_issuer"和"your_audience"是示例值,你需要根据实际情况替换为真实的值。

使用以上代码,你可以通过JwtSecurityTokenHandler类生成JWT字符串,并使用同样的类验证和解析JWT字符串。你还可以根据需要添加其他声明,设置过期时间和其他参数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书会-《博弈论究竟是什么》

一. 什么是博弈论? 博弈即一些个人、队组或其他组织,面对一定的环境条件,在一定的规则下,同时或先后,一次或多次,从各自允许选择的行为或策略中进行选择并加以实施,各自取得相应结果的过程。 博…

re学习(25)i春秋-re-basebasebase(base64+函数构造)

参考文章:re学习笔记(22)爱春秋CTF答题夺旗赛(第四季)-re-basebasebase_ctfbase~base_Forgo7ten的博客-CSDN博 总结:1.flag——→base64加密(自定义)——→与3异或——→加密后数据…

spring启动流程 (6完结) springmvc启动流程

SpringMVC的启动入口在SpringServletContainerInitializer类,它是ServletContainerInitializer实现类(Servlet3.0新特性)。在实现方法中使用WebApplicationInitializer创建ApplicationContext、创建注册DispatcherServlet、初始化ApplicationContext等。 SpringMVC…

大数据Flink(五十):流式计算简介

文章目录 流式计算简介 一、数据的时效性 二、流式计算和批量计算

dubbo概论

目录 前言: 1.概述 2.服务发现 3.容错 3.1.注册中心宕机 3.2.负载均衡 3.3.限流、熔断 4.通信协议 4.1.HTTP 4.2.dubbo 5.总结 前言: 这可能是全网最深入浅出的dubbo文章,如果你会spring cloud,恭喜你,你可…

Zookeeper命令总结

目录 1、常用命令2、ls path3、create xxx创建持久化节点创建临时节点创建持久化序列节点 4、get path5、set path6、delete path7、监听器总结1)节点的值变化监听2)节点的子节点变化监听(路径变化)3)当某个节点创建或…

Maven基础之项目创建、packaging

文章目录 创建 maven 项目流程骨架是浮云,packaging 是关键 创建 maven 项目流程 通过骨架(archetype)创建 maven 工程 第一步:选择 new → maven → Maven Project 第二步:New Maven Project 窗口不作任何设置&…

【软件测试】基于博客系统的自动化测试

目录 1.我的博客系统链接 2.使用selenium对博客系统进行自动化测试 1.引入依赖 2.创建公共类 3.创建测试套件类 4.测试登陆界面 5. 测试博客列表页 6.测试写博客页面 7.测试删除博客 8.最终运行结果 1.我的博客系统链接 用户登录 2.使用selenium对博客系统进行自动…

网络安全(黑客)系统自学,成为一名白帽黑客

前言 黑客技能是一项非常复杂和专业的技能,需要广泛的计算机知识和网络安全知识。你可以参考下面一些学习步骤,系统自学网络安全。 在学习之前,要给自己定一个目标或者思考一下要达到一个什么样的水平,是学完找工作(…

学习笔记22 map

一、概论 map的每个元素都由两个部分组成:键和值。每个键都与一个特定的值相关联,并且可以用于定位该值。 map和set很像,只不过map存储的是key,由key再映射到value,而set存储的就是value本身。 Map接口是泛型的&…

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件 之前使用过的BeanPostProcessor就是在Bean实例化之后,注入属性值之前的时机。 Spring Bean的生命周期本次演示的是在Bean实例化之前的时机,使用BeanFactoryPostProcessor进行验证,以及在加载Bean之前进…

flink to starrocks 问题集锦....

[问题排查]导入失败相关 - 问题排查 - StarRocks中文社区论坛 starrocks官网如下: Search StarRocks Docs starrocks内存配置项: 管理内存 Memory_management StarRocks Docs 问题1:实时写入starrocks ,配置参数设置如下&a…

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控,51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

华为eNSP:isis的配置

一、拓扑图 二、路由器的配置 配置接口IP AR1&#xff1a; <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthe…

【沁恒蓝牙mesh】数据收发接口与应用层模型传递

本文主要描述了沁恒蓝牙mesh SDK的蓝牙数据收发接口&#xff0c;以及应用层的回调函数解析以及模型传递 这里写目录标题 1. 数据收发接口1.1【发送数据】1.2 【数据接收】 2. 应用层模型分析 1. 数据收发接口 1.1【发送数据】 /*&#xff08;1&#xff09;接口1 */ /*接口一&…

力扣热门100题之最大子数组和【中等】【动态规划】

题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…

Java文字转语音功能实现

需要下载jacob-1.18&#xff0c;网上一堆 项目中引入pom文件 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语音 --> <dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18&…

Go语言中‘String’包中的‘Cut‘函数的实现

Go语言中‘String’包中的’Cut’函数的实现 ​ Cut函数用于在字符串**‘s’中查找子串’sep’&#xff0c;并将字符串’s’在子串 ‘sep’ 第一次出现的位置分割成两部分&#xff1a;before和after** package main import("fmt" "strings" ) func main(…

Python初学

认识计算机&#xff1a; 计算机是怎么构成的——冯诺依曼体系结构 内存外存的区别&#xff1a; 一般机械硬盘的存储数据的期限是&#xff1a;几年到十几年 什么是编程&#xff1f; 制作软件——编程/软件开发 编程语言有哪些&#xff1f; Python Python背景知识 荷兰人Guid…

M5ATOMS3基础02传感器MPU6886

M5ATOMS3基础01按键 简洁版本 MPU6886是一款6轴IMU单元&#xff0c;具有3轴重力加速度计和3轴陀螺仪。它采用16位ADC&#xff0c;内置可编程数字滤波器和片上温度传感器&#xff0c;并通过I2C接口&#xff08;地址为0x68&#xff09;与上位机通信。MPU6886支持低功耗模式&#…