C# Web API 实现 Token 认证(JWT)
1. 核心概念
- JWT (JSON Web Token):轻量级的认证协议,包含三部分:
- Header(算法和类型)
- Payload(用户数据)
- Signature(防篡改签名)
- 流程:
- 用户登录获取 Token
- API 请求携带 Token
- 服务器验证 Token
2. 实现步骤
步骤 1:安装 NuGet 包
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
Install-Package System.IdentityModel.Tokens.Jwt
步骤 2:配置 JWT 服务(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.AddAuthorization();
步骤 3:添加 appsettings.json 配置
{
"Jwt": {
"Key": "your_256_bit_secret_key_here",
"Issuer": "yourdomain.com",
"Audience": "yourapplication",
"ExpireMinutes": 30
}
}
步骤 4:创建登录控制器生成 Token
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _config;
public AuthController(IConfiguration config)
{
_config = config;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel login)
{
// 实际项目需验证数据库
if (login.Username == "admin" && login.Password == "password")
{
var token = GenerateJwtToken(login.Username);
return Ok(new { token });
}
return Unauthorized();
}
private string GenerateJwtToken(string username)
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.Role, "Admin") // 添加角色声明
};
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_config["Jwt:ExpireMinutes"])),
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
步骤 5:保护 API 端点
[Authorize] // 添加认证要求
[ApiController]
[Route("api/[controller]")]
public class ProtectedController : ControllerBase
{
[HttpGet("data")]
public IActionResult GetData()
{
// 获取当前用户信息
var username = User.Identity.Name;
var role = User.FindFirst(ClaimTypes.Role)?.Value;
return Ok(new { message = $"你好 {username}, 你的角色是 {role}" });
}
}
3. 测试流程
-
获取 Token:
POST /api/auth/login Content-Type: application/json { "username": "admin", "password": "password" }响应:
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } -
访问受保护 API:
GET /api/protected/data Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
4. 安全增强建议
- 使用 HTTPS 加密传输
- Token 设置合理有效期(如 15-30 分钟)
- 实现 Token 刷新机制
- 敏感操作要求二次认证
- 定期轮换签名密钥
注意:实际项目中需替换硬编码的用户验证逻辑为数据库查询,并添加密码哈希处理。
971

被折叠的 条评论
为什么被折叠?



