1. 安装必要的 NuGet 包
  2. 配置 JWT 设置
  3. 实现 JWT Token 的生成
  4. 实现 JWT Token 的校验
  5. 保护 API 使用 JWT

以下是详细的实现步骤:


1. 安装必要的 NuGet 包

确保你的项目中安装了以下 NuGet 包:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

2. 配置 JWT 设置

在 appsettings.json 文件中添加 JWT 相关的配置:

{
  "Jwt": {
    "Key": "YourSecretKeyMustBeVeryLongAndSecure",
    "Issuer": "YourAppName",
    "Audience": "YourAppAudience"
  }
}

注意:Key 是用来签名和验证 JWT 的密钥,必须是足够长的字符串(建议至少 16 个字符)。


3. 实现 JWT Token 的生成

创建一个服务类来生成 JWT Token:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public class JwtTokenService
{
    private readonly string _key;
    private readonly string _issuer;
    private readonly string _audience;

    public JwtTokenService(IConfiguration configuration)
    {
        _key = configuration["Jwt:Key"];
        _issuer = configuration["Jwt:Issuer"];
        _audience = configuration["Jwt:Audience"];
    }

    public string GenerateToken(string userId, string username, string role)
    {
        var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_key));
        var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, userId),
            new Claim(JwtRegisteredClaimNames.Name, username),
            new Claim(ClaimTypes.Role, role),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        };

        var token = new JwtSecurityToken(
            issuer: _issuer,
            audience: _audience,
            claims: claims,
            expires: DateTime.UtcNow.AddHours(1), // Token 有效期
            signingCredentials: credentials
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

将此服务注册到依赖注入容器中,在 Program.cs 中:

builder.Services.AddSingleton<JwtTokenService>();

4. 实现 JWT Token 的校验

在 Program.cs 中配置 JWT 认证中间件:

var jwtSettings = builder.Configuration.GetSection("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 = jwtSettings["Issuer"],
        ValidAudience = jwtSettings["Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Key"]))
    };
});

启用认证和授权中间件:

app.UseAuthentication();
app.UseAuthorization();

5. 保护 API 使用 JWT

在需要保护的 API 控制器或方法上添加 [Authorize] 属性:

[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
    [HttpGet]
    [Authorize(Roles = "Admin")] // 仅允许 Admin 角色访问
    public IActionResult Get()
    {
        return Ok(new { message = "This is a secure endpoint!" });
    }
}

6. 测试生成的 JWT Token

你可以通过一个简单的控制器来测试生成 JWT Token 的功能:

[ApiController]
[Route("api/auth")]
public class AuthController : ControllerBase
{
    private readonly JwtTokenService _jwtTokenService;

    public AuthController(JwtTokenService jwtTokenService)
    {
        _jwtTokenService = jwtTokenService;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginRequest request)
    {
        // 模拟用户登录逻辑
        if (request.Username == "admin" && request.Password == "password")
        {
            var token = _jwtTokenService.GenerateToken("1", "admin", "Admin");
            return Ok(new { token });
        }

        return Unauthorized();
    }
}

public class LoginRequest
{
    public string Username { get; set; }
    public string Password { get; set; }
}

总结

通过以上步骤,可以在 .NET 9 中实现 JWT Token 的生成和校验功能。主要分为以下几个部分:

  1. 配置 JWT 设置。
  2. 创建服务类生成 JWT Token。
  3. 配置认证中间件以校验 JWT Token。
  4. 保护 API 使用 [Authorize] 属性。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐