C#中如何配置与应用JWT功能
1. 安装必要的 NuGet 包,确保项目中安装了以下包:
bash
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
Install-Package System.IdentityModel.Tokens.Jwt
2. 配置 JWT 参数
在 appsettings.json 中添加 JWT 配置:
json
{
"JwtSettings": {
"SecretKey": "your-256-bit-secret-key-here", // 至少32字符的密钥
"Issuer": "your-issuer", // 签发者(如服务名称)
"Audience": "your-audience", // 接收者(如客户端应用)
"ExpireMinutes": 60 // Token 有效期(分钟)
}
}
3. 配置 JWT 服务
在 Program.cs 或 Startup.cs 中配置认证服务:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
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["JwtSettings:Issuer"],
ValidAudience = builder.Configuration["JwtSettings:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["JwtSettings:SecretKey"])
)
};
});
// 添加授权服务(可选,根据需要配置策略)
builder.Services.AddAuthorization();
var app = builder.Build();
// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();
app.Run();
4. 生成 JWT Token
创建一个 AuthController 处理登录和 Token 生成:
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
// 1. 验证用户凭证(示例逻辑,需替换为实际验证逻辑)
if (request.Username != "admin" || request.Password != "admin123")
{
return Unauthorized("用户名或密码错误");
}
// 2. 生成 JWT Token
var claims = new[]
{
new Claim(ClaimTypes.Name, request.Username),
new Claim(ClaimTypes.Role, "Admin") // 添加角色声明
};
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_configuration["JwtSettings:SecretKey"])
);
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["JwtSettings:Issuer"],
audience: _configuration["JwtSettings:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(
Convert.ToDouble(_configuration["JwtSettings:ExpireMinutes"])
),
signingCredentials: credentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
return Ok(new { Token = tokenString });
}
}
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
5. 保护 API 端点
使用 [Authorize] 标记需要认证的 Controller 或 Action:
[ApiController]
[Route("api/[controller]")]
[Authorize] // 整个 Controller 需要认证
public class ProtectedController : ControllerBase
{
[HttpGet("data")]
public IActionResult GetData()
{
// 获取当前用户信息(来自 Token 的 Claims)
var username = User.Identity.Name;
var role = User.FindFirst(ClaimTypes.Role)?.Value;
return Ok(new { Message = $"你好 {username},你的角色是 {role}" });
}
[HttpGet("admin-only")]
[Authorize(Roles = "Admin")] // 仅允许角色为 Admin 的用户访问
public IActionResult AdminOnly()
{
return Ok("管理员专属内容");
}
}
6. 测试 JWT 功能
(1) 登录获取 Token
http
POST /api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
响应:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
(2) 访问受保护的 API
在请求头中添加 Authorization:
http
GET /api/protected/data
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
关键点说明
密钥安全
生产环境中应使用强密钥(如 256 位随机字符串)。
避免硬编码密钥,推荐通过环境变量或密钥管理服务注入。
Token 有效期
根据安全需求设置合理的 ExpireMinutes(通常 15~60 分钟)。
签名算法
示例中使用 HMAC-SHA256(对称加密),适合单服务场景。
分布式系统可改用非对称加密(如 RSA-SHA256)。
Claims 设计
包含必要用户信息(如 UserId、Role),避免泄露敏感数据。
常见问题处理
Q1: Token 验证失败
检查 SecretKey、Issuer、Audience 是否一致。
确保请求头中的 Token 格式正确(Bearer {token})。
Q2: 跨域问题(CORS)
在 Program.cs 中配置 CORS:
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
app.UseCors("AllowAll");
Q3: 刷新 Token
实现 Refresh Token 机制,通过新的接口生成新 Token。
通过以上步骤,即可在 C# 应用中完整实现 JWT 的配置与应用。