2023年,第31周,第2篇文章。给自己一个目标,然后坚持总会有收货,不信你试试!
本篇文章主要简单讲讲,.Net Framework框架下使用JWT的代码例子,以及他们的基本概念。
2002年微软发布了.net framework 1.0,那个时候博主刚开始玩传奇游戏,接触电脑的时间还是挺早的。
目录
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字符串。你还可以根据需要添加其他声明,设置过期时间和其他参数。