.NET8中使用JWT进行身份认证和授权的实现
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、什么是 JWT?</a></li><li><a href="#_label1">二、JWT 在 .NET 8 中的使用流程</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1. 安装所需 NuGet 包</a></li><li><a href="#_lab2_1_1">2. 配置 JWT 认证服务</a></li><li><a href="#_lab2_1_2">3. 生成 JWT 令牌</a></li><li><a href="#_lab2_1_3">4. 保护 API 资源</a></li><li><a href="#_lab2_1_4">5. 客户端发送 JWT</a></li><li><a href="#_lab2_1_5">6. 配置应用设置</a></li><li><a href="#_lab2_1_6">7. 刷新 JWT</a></li></ul><li><a href="#_label2">三、总结</a></li><ul class="second_class_ul"></ul></ul></div><p>JSON Web Token(JWT)是一种非常流行的身份认证和授权方式,广泛应用于 Web 应用和微服务架构中。它允许不同系统或服务之间安全地传输信息。JWT 具有无状态的特性,能够简化认证过程,并使得系统具备更好的扩展性。在 .NET 8 中,使用 JWT 进行身份认证和授权变得更加简便和高效。本篇文章将详细介绍如何在 .NET 8 中使用 JWT。</p><p class="maodian"><a name="_label0"></a></p><h2>一、什么是 JWT?</h2>
<p>JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在不同方之间传递安全信息。它由三部分组成:</p>
<ul><li>Header(头部):包含令牌的类型和签名算法(如 HMAC SHA256 或 RSA)。</li><li>Payload(载荷):包含声明(Claims),声明可以是关于实体的信息(如用户)或其他数据。</li><li>Signature(签名):通过加密方式对 Header 和 Payload 进行签名,以确保 JWT 的完整性,防止数据被篡改。</li></ul>
<p>JWT 的格式通常是:</p>
<div class="jb51code"><pre class="brush:plain;">Header.Payload.Signature
</pre></div>
<p>其中,Header 和 Payload 是 Base64Url 编码的字符串,而 Signature 是通过加密算法生成的数字签名。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、JWT 在 .NET 8 中的使用流程</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1. 安装所需 NuGet 包</h3>
<p>首先,在 .NET 8 项目中,需要安装两个关键的 NuGet 包:</p>
<ul><li><code>Microsoft.AspNetCore.Authentication.JwtBearer</code>:用于处理 JWT 认证的中间件。</li><li><code>System.IdentityModel.Tokens.Jwt</code>:用于生成和解析 JWT 令牌。</li></ul>
<p>使用以下命令安装:</p>
<div class="jb51code"><pre class="brush:csharp;">dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2. 配置 JWT 认证服务</h3>
<p>在 .NET 8 中,配置 JWT 认证服务的步骤已经简化,不再需要 <code>Startup.cs</code> 文件,所有配置都可以在 <code>Program.cs</code> 中完成。</p>
<p>打开 <code>Program.cs</code> 文件并添加如下配置:</p>
<div class="jb51code"><pre class="brush:csharp;">using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// 获取 JWT 配置信息
var jwtSecretKey = builder.Configuration["Jwt:SecretKey"];
var jwtIssuer = builder.Configuration["Jwt:Issuer"];
var jwtAudience = builder.Configuration["Jwt:Audience"];
// 注册 JWT 认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = jwtIssuer, // 发行者
ValidAudience = jwtAudience, // 受众
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecretKey)), // 签名密钥
ValidateIssuer = true, // 验证发行者
ValidateAudience = true, // 验证受众
ValidateLifetime = true, // 验证过期时间
ClockSkew = TimeSpan.Zero // 设置允许的时间偏差,默认是5分钟
};
});
builder.Services.AddAuthorization();
builder.Services.AddControllers();
var app = builder.Build();
// 启用认证中间件
app.UseAuthentication();
// 启用授权中间件
app.UseAuthorization();
// 配置路由
app.MapControllers();
app.Run();
</pre></div>
<p>配置解释:</p>
<ul><li><code>Jwt:SecretKey</code>、<code>Jwt:Issuer</code>、<code>Jwt:Audience</code>:从 <code>appsettings.json</code> 配置文件中读取密钥、发行者和受众。</li><li><code>AddAuthentication(JwtBearerDefaults.AuthenticationScheme)</code>:告诉应用使用 JWT 认证方式。</li><li><code>TokenValidationParameters</code>:设置 JWT 的验证规则,包括验证发行者、受众、签名密钥等。</li></ul>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>3. 生成 JWT 令牌</h3>
<p>生成 JWT 令牌通常发生在用户登录时,成功验证用户身份后,后端会生成并返回 JWT 令牌。在 .NET 8 中,我们可以通过以下方式生成 JWT 令牌:</p>
<div class="jb51code"><pre class="brush:csharp;">using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
public class JwtTokenService
{
private readonly string _secretKey;
private readonly string _issuer;
private readonly string _audience;
public JwtTokenService(IConfiguration configuration)
{
_secretKey = configuration["Jwt:SecretKey"];
_issuer = configuration["Jwt:Issuer"];
_audience = configuration["Jwt:Audience"];
}
// 生成 JWT 令牌
public string GenerateToken(string username)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username), // 用户名
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) // JWT ID
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _issuer, // 发行者
audience: _audience, // 受众
claims: claims,
expires: DateTime.Now.AddHours(1), // 设置有效期为1小时
signingCredentials: creds // 签名凭证
);
return new JwtSecurityTokenHandler().WriteToken(token); // 返回生成的JWT
}
}
</pre></div>
<p>生成 JWT 的步骤:</p>
<ul><li>创建 Claims(声明),例如用户名和 JWT ID。</li><li>使用对称密钥(<code>SymmetricSecurityKey</code>)对 JWT 进行签名。</li><li>设置有效期、发行者和受众,并使用 <code>JwtSecurityTokenHandler</code> 来生成 JWT 令牌。</li></ul>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>4. 保护 API 资源</h3>
<p>一旦我们配置了 JWT 认证,我们就可以在需要保护的 API 上使用 <code></code> 特性。这意味着只有携带有效 JWT 的用户才能访问这些受保护的 API。</p>
<p>例如,下面是一个受保护的控制器:</p>
<div class="jb51code"><pre class="brush:csharp;">using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
// 只有认证通过的用户才能访问
")]
public class SecureController : ControllerBase
{
public IActionResult GetProtectedData()
{
return Ok(new { message = "This is a protected resource." });
}
}
</pre></div>
<p> 特性:该特性用于标记需要授权的 API。只有经过身份验证的用户才能访问这些资源。如果用户未提供有效 JWT 或 JWT 已过期,系统将返回 <code>401 Unauthorized</code> 响应。</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>5. 客户端发送 JWT</h3>
<p>客户端需要将 JWT 添加到 HTTP 请求头的 <code>Authorization</code> 字段中。请求格式如下:</p>
<div class="jb51code"><pre class="brush:plain;">Authorization: Bearer <your-jwt-token>
</pre></div>
<p>客户端通常会在 <code>localStorage</code> 或 <code>sessionStorage</code> 中存储 JWT,并在每次访问受保护资源时通过请求头发送 JWT。</p>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>6. 配置应用设置</h3>
<p>为了保持应用的灵活性,JWT 密钥、发行者和受众等信息通常会存储在 <code>appsettings.json</code> 文件中:</p>
<div class="jb51code"><pre class="brush:json;">{
"Jwt": {
"SecretKey": "your-256-bit-secret",
"Issuer": "yourIssuer",
"Audience": "yourAudience"
}
}
</pre></div>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>7. 刷新 JWT</h3>
<p>JWT 通常具有较短的有效期(例如 1 小时),但为了提升用户体验,我们可以实现一个刷新令牌机制,允许用户在 JWT 过期后通过刷新令牌获取新的 JWT。</p>
<p>刷新令牌通常是长期有效的,直到用户注销或令牌被撤销。实现刷新令牌的过程比较复杂,涉及到生成和验证刷新令牌等逻辑,但它是许多现代 Web 应用程序和 API 中常见的身份验证模式。</p>
<p class="maodian"><a name="_label2"></a></p><h2>三、总结</h2>
<p>在 .NET 8 中,JWT 提供了一种高效且无状态的方式来进行身份认证和授权。通过 <code>Program.cs</code> 文件中的配置,我们可以轻松实现 JWT 验证、生成和保护 API 的功能。此外,JWT 的无状态特性使得它在分布式系统和微服务架构中非常有用。</p>
<p>整个 JWT 身份验证的流程包括:</p>
<ul><li>配置 JWT 认证服务。</li><li>在用户登录时生成 JWT。</li><li>客户端携带 JWT 请求受保护的 API。</li><li>后端验证 JWT 的有效性并进行授权。</li></ul>
<p>JWT 的使用使得系统更加轻量级,避免了服务器存储会话信息,特别适用于现代 Web 应用、SPA 和微服务架构。</p>
頁:
[1]