共计 2837 个字符,预计需要花费 8 分钟才能阅读完成。
背景与痛点
在 WebAPI 开发中,身份验证是保护接口安全的第一道防线。传统的 Session 验证方式存在服务器存储压力大、跨域支持差等问题。相比之下,Token 验证(特别是 JWT)具有以下优势:

- 无状态:服务器不需要存储会话信息
- 跨域友好:适合前后端分离架构
- 可扩展:Token 中可以携带自定义 claims
- 标准化:JWT 已成为行业标准
JWT 技术简介
JWT 由三部分组成,用点号连接:
- Header:包含算法和 token 类型
- Payload:存储用户信息和其他数据(claims)
- Signature:用于验证消息完整性的签名
一个典型的 JWT 看起来像这样:xxxxx.yyyyy.zzzzz
核心实现步骤
1. 安装 NuGet 包
首先需要安装必要的依赖包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt
2. 配置 JWT 服务
在 Startup.cs 中配置 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"]))
};
});
3. 实现 Token 生成服务
创建 Token 生成服务类:
public class TokenService
{
private readonly IConfiguration _configuration;
public TokenService(IConfiguration configuration)
{_configuration = configuration;}
public string GenerateToken(User user)
{var claims = new[]
{new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.Username)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
4. 配置授权策略
在 Startup.cs 中添加授权策略:
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole",
policy => policy.RequireRole("Admin"));
});
完整示例代码
认证控制器
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly TokenService _tokenService;
public AuthController(TokenService tokenService)
{_tokenService = tokenService;}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
// 验证用户逻辑...
var token = _tokenService.GenerateToken(user);
return Ok(new { token});
}
}
受保护的 API
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{[HttpGet]
public IActionResult Get()
{
// 只有携带有效 Token 才能访问
return Ok("Secure data");
}
[Authorize(Policy = "RequireAdminRole")]
[HttpGet("admin")]
public IActionResult AdminOnly()
{
// 只有 Admin 角色能访问
return Ok("Admin data");
}
}
安全考量
Token 过期
设置合理的过期时间(如 30 分钟),避免 Token 长期有效。可以通过exp claim 实现。
刷新 Token
实现刷新 Token 机制,避免用户频繁登录。通常使用较长时间有效期的 refresh token 来获取新的 access token。
防篡改
确保使用足够强度的密钥(至少 256 位),并启用 HTTPS 传输。
常见问题
- Token 无效:检查密钥、Issuer 和 Audience 配置是否一致
- 跨域问题 :确保 CORS 配置正确,特别是
AllowCredentials和AllowedHeaders - 性能问题:对于高并发场景,考虑 Token 黑名单机制
进阶思考
可以扩展实现:
- 多因素认证
- 基于声明的细粒度授权
- OAuth2.0 集成
- 分布式 Token 验证
结语
JWT 为 WebAPI 提供了灵活、安全的认证方案。本文介绍了基础实现,但在生产环境中,还需要考虑更多安全因素。推荐进一步学习:
- JWT RFC 标准文档
- OAuth2.0 和 OpenID Connect
- ASP.NET Core 安全最佳实践
希望这篇指南能帮助你快速构建安全的 API 认证系统!
正文完
