在 .NET 8.0 中实现 JWT(JSON Web Token)登录和鉴权,可以帮助我们在构建 Web API 时确保安全性。在这篇文章中,我们将通过一个示例说明如何在 .NET 8.0 Web API 项目中使用 JWT 进行用户身份验证。
1. 创建项目
首先,我们需要创建一个新的 .NET 8.0 Web API 项目。在命令行中运行以下命令:
dotnet new webapi -n JwtAuthExample
cd JwtAuthExample
2. 安装 NuGet 包
我们需要添加一些依赖包来支持 JWT 认证。打开终端并运行:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.Text.Json
3. 配置 JWT 选项
在 appsettings.json
中添加 JWT 配置:
{
"Jwt": {
"Key": "YourSuperSecretKey12345",
"Issuer": "YourIssuer",
"Audience": "YourAudience",
"ExpireMinutes": 60
},
// 其他配置...
}
4. 创建用户模型
我们需要一个用户模型来表示用户信息,这里我们创建一个简单的 User
类:
public class User
{
public string Username { get; set; }
public string Password { get; set; }
}
5. 创建 JWT 服务
接下来,我们需要一个服务来生成 JWT。创建一个 JwtTokenService
类:
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
public class JwtTokenService
{
private readonly IConfiguration _configuration;
public JwtTokenService(IConfiguration configuration)
{
_configuration = configuration;
}
public string GenerateToken(string username)
{
var claims = new[]
{
new Claim(ClaimTypes.Name, 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(Convert.ToDouble(_configuration["Jwt:ExpireMinutes"])),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
6. 配置身份验证
在 Program.cs
文件中配置身份验证服务:
var builder = WebApplication.CreateBuilder(args);
// 添加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 = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});
builder.Services.AddSingleton<JwtTokenService>();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
7. 创建登录控制器
然后我们需要一个控制器来处理用户登录请求:
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class AuthController : ControllerBase
{
private readonly JwtTokenService _jwtTokenService;
public AuthController(JwtTokenService jwtTokenService)
{
_jwtTokenService = jwtTokenService;
}
[HttpPost("login")]
public IActionResult Login([FromBody] User user)
{
// 在这里验证用户(通常是查询数据库)
if (user.Username == "test" && user.Password == "password") // 示例用户
{
var token = _jwtTokenService.GenerateToken(user.Username);
return Ok(new { Token = token });
}
return Unauthorized();
}
}
8. 保护其他控制器
我们可以创建一个受保护的控制器,只有在提供有效的 JWT 时才能访问:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
[Authorize]
public class ProtectedController : ControllerBase
{
[HttpGet]
public IActionResult GetProtectedData()
{
return Ok("This is protected data.");
}
}
9. 测试
您可以使用 Postman 或其他工具测试 API:
- 进行登录请求 (POST /auth/login),如:
{
"username": "test",
"password": "password"
}
成功后将返回一个 JWT。
- 使用上述 JWT 访问受保护的资源 (GET /protected),并在请求头中添加 Authorization 头:
Authorization: Bearer [your_token]
结论
通过上述步骤,我们已经在 .NET 8.0 Web API 项目中实现了 JWT 登录和鉴权。JWT 让我们的 API 更加安全,同时确保了用户的身份验证过程简单高效。这种方式适合于 RESTful 风格的接口,是当前主流的身份验证方式之一。