发布于2026-07-23 阅读(0)
扫一扫,手机访问
在后台开发中,聊到身份认证,JWT几乎是绕不开的话题。JSON Web Token(JWT)提供了一种既高效又无状态的方式来在不同系统之间安全地传递信息,特别适合现代Web应用和微服务架构。它最大的好处就是简化了认证流程,让系统扩展起来更轻松。而在.NET 8中,集成JWT认证和授权,比以往任何版本都更直接、更顺手。这篇文章就来一步步拆解这个过程。
JWT(JSON Web Token)本质上是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。你可能会问,它到底长什么样?简单来说,它由三部分拼接而成:
最终的格式就像这样:
Header.Payload.Signature
其中Header和Payload是Base64Url编码的,而Signature则是加密后的数字签名。
动手之前,先得把工具准备好。在你的.NET 8项目中,需要引入两个核心库:
Microsoft.AspNetCore.Authentication.JwtBearer:负责处理JWT认证的中间件。System.IdentityModel.Tokens.Jwt:用来生成和解析JWT令牌。直接在终端里运行下面两条命令就行:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package System.IdentityModel.Tokens.Jwt
这也是.NET 8的一个舒服之处——不再需要单独的Startup.cs文件,所有配置都可以统一在Program.cs里搞定。打开Program.cs,把认证服务加进去:
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
};
});
builder.Services.AddAuthorization();
builder.Services.AddControllers();
var app = builder.Build();
// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();这段配置其实在说几件事:
appsettings.json里读取,方便后续调整。AddAuthentication(JwtBearerDefaults.AuthenticationScheme)告诉应用:我就要用JWT来认证。TokenValidationParameters则定义了具体的验证规则,比如要不要验证发行者、受众、令牌是否过期等。这里把ClockSkew设为零,意味着令牌过期时间到了就立即失效,不留缓冲。生成令牌的时机通常是在用户登录成功后。验证通过,后端就签发一个JWT返回给客户端。下面是一个典型的服务类实现:
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"];
}
public string GenerateToken(string username)
{
var claims = new List
{
new Claim(ClaimTypes.Name, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
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),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
} 逻辑很清晰:先构造声明(Claims),比如用户名和唯一的JWT ID;然后用对称密钥生成签名;最后指定有效期——这里设为1小时。通过JwtSecurityTokenHandler写入并返回一个字符串格式的JWT。
有了JWT认证的配置,保护API就变得非常简单了。只需要在需要认证的控制器或方法上加上[Authorize]特性:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class SecureController : ControllerBase
{
[HttpGet]
public IActionResult GetProtectedData()
{
return Ok(new { message = "This is a protected resource." });
}
}加了这个特性之后,所有访问该控制器的请求都必须携带一个有效的JWT。如果令牌缺失、过期或者无效,服务端会直接返回401 Unauthorized。
客户端这边,每次请求受保护的资源时,都需要在HTTP请求头中带上JWT,格式如下:
Authorization: Bearer
通常的做法是把令牌存在localStorage或sessionStorage里,然后在发起请求时手动拼接这个Header。
为了保持灵活性,密钥、发行者、受众这些信息,最好放在appsettings.json里:
{
"Jwt": {
"SecretKey": "your-256-bit-secret",
"Issuer": "yourIssuer",
"Audience": "yourAudience"
}
}JWT的有效期通常不会太长,但为了提升用户体验,刷新令牌机制几乎是标配。简单来说,就是提供一个长期有效的刷新令牌,让用户在JWT过期后用它来换取一个新的JWT,避免频繁登录。实现起来会涉及更多逻辑,比如生成和验证刷新令牌、存储和管理等,但这是现代Web应用和API中非常常见的做法。
在.NET 8中,JWT提供了一种干净、无状态的身份认证和授权方案。通过Program.cs中的集中配置,我们可以轻松地实现JWT的验证、生成以及对API的保护。整个流程大致可以概括为:
因为不需要在服务端存储会话信息,JWT让系统变得更加轻量,特别适合分布式系统、SPA(单页应用)和微服务架构。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8