共计 2126 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
在 Web 应用中,用户认证是保证系统安全的重要环节。传统的 Session 认证方式存在一些明显的局限性:

- 服务器需要存储 Session 数据,增加了内存压力
- 在分布式系统中,Session 同步问题难以解决
- 移动端和跨域场景下支持不够友好
- 扩展性较差,难以支持现代微服务架构
JWT(JSON Web Token)作为一种无状态的认证机制,正好可以解决这些问题。它通过客户端存储令牌,服务器只需验证令牌的有效性,无需保存会话状态,非常适合分布式系统。
JWT 核心原理
JWT 由三部分组成,用点 (.) 连接:
- Header – 包含令牌类型和签名算法
- Payload – 包含声明 (claims) 和数据
- Signature – 对前两部分的签名,防止篡改
JWT 的工作流程很简单:
- 用户登录成功后,服务器生成 JWT 并返回给客户端
- 客户端保存 JWT,后续请求在 Authorization 头中携带
- 服务器验证 JWT 有效性并处理请求
.NET 实现
安装依赖
dotnet add package System.IdentityModel.Tokens.Jwt
生成 Token
public string GenerateJwtToken(User user)
{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.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
验证 Token
在 ASP.NET Core 中配置 JWT 认证:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
安全考量
Token 过期和刷新
- 设置合理的过期时间(通常 30 分钟 - 2 小时)
- 实现 Refresh Token 机制延长会话
- 使用滑动过期策略
防止攻击
- 始终使用 HTTPS 传输
- 设置 SameSite 属性防止 CSRF
- 避免在 URL 中传输 Token
- 设置 HttpOnly 和 Secure 标志
敏感信息
- 不要在 Payload 中存储敏感数据
- 必要时加密 Payload
- 密钥长度至少 256 位
性能优化
大规模部署
- 考虑使用非对称加密算法减轻服务器负担
- 实现 Token 缓存减少验证开销
- 分布式系统可使用共享密钥或集中验证服务
分布式验证
- 使用 OAuth 2.0 集中授权服务器
- 实现 Token 黑名单机制
- 考虑 JWT 与 API 网关集成
生产环境避坑指南
常见错误
- 密钥太短或硬编码在代码中
- 未验证 Token 签名
- 过期时间设置过长
- 未正确处理 Token 失效场景
监控建议
- 记录失败的认证尝试
- 监控 Token 生成和验证性能
- 设置告警检测异常 Token 使用
总结与进阶思考
JWT 非常适合现代 Web 应用和 API 服务,特别是需要跨域、分布式部署的场景。但它不是万能的,以下情况可能需要考虑其他方案:
- 需要即时撤销 Token 的场景
- 传输大量敏感数据的场景
- 对实时性要求极高的场景
进阶学习方向:
- OAuth 2.0 和 OpenID Connect
- 微服务架构中的认证授权
- 零信任安全模型
通过本文的介绍,你应该已经掌握了在 C# 中使用 JWT 实现安全认证的完整方案。记住,安全是一个持续的过程,需要根据实际需求和威胁模型不断调整策略。
正文完
