如何在ASP.NET Core中实现JWT身份验证?

在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项目。

评论