- A+
在现代 Web 应用中,安全认证是确保用户数据和系统安全的重要一环。JSON Web Token (JWT) 是一种流行的认证方式,它可以在客户端和服务端之间安全地传递信息。本文将详细介绍 JWT Bearer 认证的概念、工作原理、在 .NET Core 中的实现步骤,以及最佳实践。
一、什么是 JWT?
JSON Web Token (JWT) 是一个开放标准(RFC 7519),用于以安全的方式在网络应用环境中传递声明信息。JWT 的基本结构由三个部分组成:
-
头部 (Header):通常包含令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256)。
-
负载 (Payload):包含要传递的数据,称为声明 (Claims),可以是关于用户的信息或其他元数据。
-
签名 (Signature):通过将编码后的头部和负载与一个密钥结合,使用指定的算法生成的签名,用于验证令牌的真实性。
JWT 的结构示例如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
二、JWT Bearer 认证的工作原理
在 JWT Bearer 认证中,用户通过提供凭据(如用户名和密码)进行身份验证。以下是基本的工作流程:
-
用户登录:用户发送登录请求,附带用户名和密码。
-
生成 JWT:服务器验证凭据后生成 JWT,并将其返回给用户。
-
使用 JWT:用户在后续的 API 请求中,将 JWT 作为 Bearer Token 发送。
-
验证 JWT:服务器接收到请求后,验证 JWT 的有效性。如果有效,则允许访问相应的资源。
JWT 的优势在于它是自包含的,包含了所有用户所需的信息,无需在服务器上存储会话状态。
三、在 .NET Core 中实现 JWT Bearer 认证
1. 安装所需 NuGet 包
在您的 .NET Core 项目中安装 JWT Bearer 认证所需的 NuGet 包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt
2. 配置 JWT 认证服务
在 Program.cs
文件中配置 JWT Bearer 认证。以下是完整示例:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// 读取 JWT 配置
var jwtSection = builder.Configuration.GetSection("JwtSettings");
var key = jwtSection.GetValue<string>("Key");
var issuer = jwtSection.GetValue<string>("Issuer");
var audience = jwtSection.GetValue<string>("Audience");
// 配置 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 = issuer,
ValidAudience = audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))
};
});
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthentication(); // 使用认证中间件
app.UseAuthorization(); // 使用授权中间件
app.MapControllers(); // 映射控制器
app.Run();
3. 在 appsettings.json
中配置 JWT 设置
在 appsettings.json
中添加 JWT 的配置:
{
"JwtSettings": {
"Key": "dsggdgewt3452345sbvsdgsdfsvxGHLKGFFJHLL", // 生成 JWT 所用的密钥
"Issuer": "mywebapiTest", // JWT 的颁发者
"Audience": "mywebapiTest" // JWT 的接收者
},
"AllowedHosts": "*"
}
4. 生成 JWT
在用户成功登录后生成 JWT。可以创建一个控制器处理登录请求:
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace MyApp.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel login)
{
// 验证用户身份(示例中使用简单的硬编码,实际应调用数据库验证)
if (login.Username == "test" && login.Password == "password")
{
var claims = new[]
{
new Claim(ClaimTypes.Name, login.Username)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSettings:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["JwtSettings:Issuer"],
audience: _configuration["JwtSettings:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30), // 设置过期时间
signingCredentials: creds);
return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
}
return Unauthorized(); // 认证失败
}
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
}
5. 保护 API 端点
可以通过 [Authorize]
特性保护需要身份验证的 API 端点:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
[Authorize] // 保护此 API
[HttpGet]
public IActionResult Get()
{
return Ok(new { Weather = "Sunny" });
}
}
}
四、测试 JWT Bearer 认证
-
登录:发送 POST 请求到
/api/auth/login
,使用 JSON 格式的用户名和密码进行身份验证。成功后将返回一个 JWT。示例请求体:
{
"username": "test",
"password": "password"
} -
访问受保护的 API:在请求头中添加
Authorization
字段,格式为Bearer {token}
。示例请求:
GET /weatherforecast HTTP/1.1
Authorization: Bearer {your_token}
五、最佳实践
-
密钥管理:确保 JWT 的密钥安全,不要将其硬编码在代码中。可以使用环境变量或密钥管理服务。
-
过期时间:合理设置 JWT 的过期时间,以防长期有效的令牌被滥用。
-
黑名单机制:在用户注销或更改密码时,考虑实现黑名单机制,以便失效旧的 JWT。
-
HTTPS:始终通过 HTTPS 传输 JWT,防止中间人攻击。
六、总结
JWT Bearer 认证为 .NET Core 应用程序提供了一种简单、安全的身份验证方式。通过本教程,您可以了解如何在 .NET Core 中实现 JWT 认证,从基本配置到实际应用,掌握 JWT 的使用。这种认证机制不仅提高了安全性,还增强了 API 的灵活性和可扩展性。希望您在项目中能够顺利实现 JWT Bearer 认证,提升应用的安全性与用户体验。
jwt解析:https://jwt.io/