C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门

2次阅读

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

C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门

在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令牌。

C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门

YouMind

ai内容创作和信息整理平台

C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门 207

查看详情 C#如何实现JWT(JSON Web Token)认证?ASP.NET Core Web API安全入门

示例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相关配置写入 appsettings.json

"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机制和更细粒度的权限控制。

text=ZqhQzanResources