.net 9 web api项目 怎么添加 jwt token 生成和校验功能
·
- 安装必要的 NuGet 包
- 配置 JWT 设置
- 实现 JWT Token 的生成
- 实现 JWT Token 的校验
- 保护 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 的生成和校验功能。主要分为以下几个部分:
- 配置 JWT 设置。
- 创建服务类生成 JWT Token。
- 配置认证中间件以校验 JWT Token。
- 保护 API 使用
[Authorize]属性。
更多推荐
所有评论(0)