共计 2490 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点:为什么选择 JWT
传统的 Session 认证方式在分布式系统中暴露出明显短板。每次请求都需要服务器查询 Session 存储(如内存或数据库),这导致:

- 横向扩展困难:需要 Session 共享机制
- CSRF 攻击风险:依赖 Cookie 携带 SessionID
- 移动端适配差:原生 App 处理 Cookie 不便
JWT 通过自包含的 Token 结构完美解决这些问题:
- 无状态:所有认证信息存储在 Token 中
- 跨域友好:通过 Authorization 头传递
- 标准化:RFC 7519 规范,各语言通用
JWT 结构深度解析
一个典型的 JWT 形如aaa.bbb.ccc,由三部分组成:
-
Header:声明令牌类型和签名算法
{ "alg": "HS256", "typ": "JWT" } -
Payload:携带业务数据(称为 Claims)
{ "sub": "user123", "name": "张三", "iat": 1516239022, "exp": 1516242622 } -
Signature:对前两部分签名,防篡改
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
.NET 6 实战配置
第一步:安装必要 NuGet 包
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
第二步:Startup 核心配置
// Program.cs
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "yourdomain.com",
ValidateAudience = true,
ValidAudience = "yourclient",
ValidateLifetime = true,
// WARNING: 生产环境必须使用安全方式存储
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!)),
ValidateIssuerSigningKey = true,
ClockSkew = TimeSpan.Zero // 严格校验过期时间
};
});
登录控制器实现
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _config;
public AuthController(IConfiguration config)
{_config = config;}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel user)
{
// 1. 验证用户凭证(示例简化,实际应查数据库)if (user.Username != "test" || user.Password != "123456")
return Unauthorized();
// 2. 生成 JWT
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]!));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{new Claim(JwtRegisteredClaimNames.Sub, user.Username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim("CustomClaim", "SomeValue")
};
var token = new JwtSecurityToken(issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: credentials);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
}
}
安全加固策略
防御重放攻击
- 使用
jti(JWT ID)唯一标识符 - 服务端维护短期 Token 黑名单
- 结合 IP 指纹限制异常请求
敏感信息规范
- 不要在 Payload 存储密码等敏感数据
- 使用
[SensitiveData]标记需要加密的字段 - 生产环境必须通过
dotnet user-secrets或 Azure Key Vault 管理密钥
性能优化建议
算法选择
| 算法 | 类型 | 适用场景 |
|---|---|---|
| HS256 | 对称加密 | 单服务架构 |
| RS256 | 非对称加密 | 微服务架构 |
Token 存储策略
- 前端:建议使用 HttpOnly 的 Cookie 存储
- 移动端:SecureStorage 异步 API
- 避免 localStorage(XSS 风险)
常见生产环境问题
- 时钟偏差:多服务器需同步 NTP 时间
- Token 膨胀:控制 Claim 数量(建议 <4KB)
- 日志泄露:过滤 Authorization 头日志
延伸阅读
通过本文的实践方案,您已经掌握了构建生产级 JWT 认证系统的关键技能。建议在真实项目中先从测试环境验证,逐步完善监控和熔断机制。安全无小事,每一个配置细节都值得认真对待。
正文完
