在ASP.NET Core中实现基于JWT(JSON Web Token)的身份验证可以有效地保护API并支持跨平台身份验证。以下是实现JWT身份验证的步骤:
1. 安装必要的包
确保安装了以下NuGet包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. 配置JWT服务
在Program.cs(或Startup.cs,取决于项目版本)中配置JWT验证。
添加认证服务:
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "YourIssuer",
ValidAudience = "YourAudience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey"))
};
});
3. 生成JWT令牌
通常在用户成功登录后,生成JWT令牌。
示例生成代码:
public string GenerateJwtToken(string username)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey"));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: "YourIssuer",
audience: "YourAudience",
claims: claims,
expires: DateTime.Now.AddHours(1),
signingCredentials: credentials);
return new JwtSecurityTokenHandler().WriteToken(token);
}
4. 保护API端点
使用[Authorize]特性保护API端点:
示例控制器:
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
[HttpGet("data")]
public IActionResult GetSecureData()
{
return Ok(new { Message = "This is a secure data endpoint." });
}
}
5. 在中间件中启用身份验证
启用身份验证中间件,以确保每个请求经过验证。
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
6. 测试
使用Postman或其他工具发送带有Authorization: Bearer <token>的请求,验证是否能够访问受保护的端点。
检查令牌的过期时间、签名和权限。
注意事项
- 确保SecretKey安全,建议使用环境变量存储。
- 使用HTTPS保护传输中的令牌。
- 定期更新和管理签名密钥以增强安全性。
这套实现方法广泛适用于大多数ASP.NET Core项目。