在C#的WebAPI项目中,JWT(JSON Web Token)是一种轻量且安全的身份认证方案。服务端在用户登录成功后签发Token,客户端后续请求在请求头中携带该Token,服务端通过统一中间件校验其合法性,从而决定是否放行接口。

一、准备JWT相关依赖
在.NET Core或.NET 6及以上版本的WebAPI项目中,通常引入以下NuGet包:
- Microsoft.AspNetCore.Authentication.JwtBearer
- System.IdentityModel.Tokens.Jwt
二、生成JWT Token
用户登录时,校验账号密码正确后,使用密钥生成包含用户信息的Token,代码示例如下:
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
public class TokenService
{
// 签名密钥,实际项目请从配置中读取
private readonly string _secret = "this_is_a_demo_secret_key_1234567890";
public string GenerateToken(string userName)
{
// 定义Token中的声明信息
var claims = new[]
{
new Claim(ClaimTypes.Name, userName),
new Claim("role", "user")
};
// 创建对称安全密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
// 生成Token
var token = new JwtSecurityToken(
issuer: "demo_issuer",
audience: "demo_audience",
claims: claims,
expires: DateTime.Now.AddHours(2),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
三、在WebAPI中配置JWT验证
在Program.cs或Startup.cs里,将JWTBearer认证方案添加到管道中:
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 = "demo_issuer",
ValidAudience = "demo_audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("this_is_a_demo_secret_key_1234567890"))
};
});
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
四、在控制器中启用Token验证
使用[Authorize]特性修饰控制器或接口方法,没有携带合法Token的请求将被拒绝:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/user")]
[Authorize]
public class UserController : ControllerBase
{
[HttpGet("info")]
public IActionResult GetInfo()
{
// 从Token声明中获取用户名
var name = User.Identity.Name;
return Ok(new { message = "验证成功", user = name });
}
[AllowAnonymous]
[HttpPost("login")]
public IActionResult Login(string name, string pwd)
{
// 简单演示,实际需校验密码
if (name == "admin" && pwd == "123")
{
var service = new TokenService();
var token = service.GenerateToken(name);
return Ok(new { token });
}
return Unauthorized();
}
}
五、客户端如何调用
登录接口返回Token后,客户端在请求头中加入:
Authorization: Bearer 你的Token字符串
这样访问带有[Authorize]的接口时,WebAPI会自动校验Token签名与有效期,实现安全的身份鉴权。
小结
在C# WebAPI中使用JWT实现Token验证,核心步骤是生成Token、配置JwtBearer中间件、用Authorize特性保护接口。注意密钥不能硬编码在代码中,生产环境应从配置或密钥管理服务读取,并设置合理的过期时间。