JWT是一种无状态的开放标准,用于安全传输用户信息,由Header、Payload、Signature三部分组成;在ASP.NET Core中,通过添加JwtBearer认证服务、配置TokenValidationParameters参数,并在登录接口生成令牌,实现API安全验证;使用[Authorize]特性保护接口,客户端在请求头携带Bearer Token进行身份验证。

在ASP.NET Core Web API中实现JWT认证是保障接口安全的常见方式。它通过生成一个包含用户信息的加密令牌,让客户端在后续请求中携带该令牌进行身份验证,避免每次请求都登录。
什么是JWT?
JWT(jsON Web Token)是一种开放标准(RFC 7519),用于在各方之间以json格式安全地传输信息。一个JWT字符串通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),格式为 xxx.yyy.zzz。
例如:
eyJhbGciOiJIUzI1NiisInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT的优势在于无状态,服务端不需要存储会话信息,适合分布式系统和前后端分离架构。
配置JWT认证服务
在 Program.cs 中添加JWT认证配置:
安装NuGet包(若未安装):
microsoft.AspNetCore.Authentication.JwtBearer
在 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(); var app = builder.Build(); // 启用认证和授权中间件 app.UseAuthentication(); app.UseAuthorization();
确保这两个中间件在路由之后、控制器之前调用。
生成JWT令牌
创建一个简单的登录接口,在用户凭证验证通过后生成JWT令牌。
示例Controller代码:
[ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { [HttpPost("login")] public IActionResult Login([FromBody] LoginModel model) { // 这里应验证用户名密码(可对接数据库或Identity) if (model.Username == "admin" && model.Password == "password") { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes("your-very-secret-key-that-is-long-enough"); // 应从配置读取 var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, model.Username), new Claim(ClaimTypes.Role, "User") // 可扩展角色 }), Expires = DateTime.UtcNow.AddHours(2), Issuer = "your-site.com", Audience = "users", SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256) }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); return Ok(new { Token = tokenString }); } return Unauthorized(); } }
定义LoginModel:
public class LoginModel { public string Username { get; set; } public string Password { get; set; } }
保护API接口
使用 [Authorize] 特性标记需要认证的控制器或方法:
[Authorize] [ApiController] [Route("api/[controller]")] public class SecureController : ControllerBase { [HttpGet] public IActionResult Get() { var username = User.Identity.Name; return Ok(new { Message = $"Hello, {username}", Time = DateTime.Now }); } }
启动项目后,先调用 /api/auth/login 获取token,然后在后续请求的Header中添加:
Authorization: Bearer
如果token无效或过期,将返回401状态码。
配置JWT参数(推荐做法)
"Jwt": { "Key": "your-super-secret-key-must-be-long-enough-for-security", "Issuer": "your-site.com", "Audience": "users" }
在代码中通过 builder.Configuration[“Jwt:Key”] 读取,提高可维护性。
基本上就这些。只要配置好认证服务、生成token并正确传递,就能在ASP.NET Core中实现基础的JWT认证。实际项目中建议结合数据库验证用户、刷新token机制和更细粒度的权限控制。