在现代的 Web 应用程序中,认证与授权是确保应用程序安全性的重要组成部分。JWT(JSON Web Token)是一种用于在各方之间传递信息的紧凑、安全的方式,广泛应用于 .NET Core 中的认证与授权流程。本文将详细介绍在 .NET Core 中如何使用 JWT 进行用户认证和授权。
一、什么是 JWT?
JWT 是一种基于 JSON 的开放标准(RFC 7519),用于在网络应用环境中传递声明信息。JWT 由三部分组成:Header(头部)、Payload(载荷)、Signature(签名)。这三部分通过点号(.)连接,形成一个 JWT 字符串。
Header: 包含令牌的类型和使用的加密算法。
Payload: 包含声明信息,可以是用户信息,也可以是其他元数据。
Signature: 使用 Header 中指定的算法和一个密钥对 Header 和 Payload 进行签名,确保令牌的完整性和安全性。
二、为什么使用JWT?
跨域支持: JWT 是自包含的令牌,可以跨不同的域或微服务传递。
轻量级: 不需要在服务器端存储会话信息,减少了服务器负担。
更高的安全性: 由于其不可篡改的签名特性,确保了令牌的完整性。
三、在 .NET Core 中集成 JWT
1. 添加必要的 NuGet 包
在 .NET Core 项目中使用 JWT,需要安装以下 NuGet 包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. 配置 JWT 认证服务
在 Startup.cs 中,配置 JWT 认证服务:
public void ConfigureServices(IServiceCollection services)
{
// 配置身份验证方案为 JWT
services.AddAuthentication(options =>
{
// 设置默认的身份验证和挑战方案为 JwtBearer
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
// 配置 JWT Bearer 选项
.AddJwtBearer(options =>
{
// 配置 Token 验证参数
options.TokenValidationParameters = new TokenValidationParameters
{
// 验证发行者
ValidateIssuer = true,
// 验证受众
ValidateAudience = true,
// 验证令牌有效期
ValidateLifetime = true,
// 验证签名密钥
ValidateIssuerSigningKey = true,
// 发行者
ValidIssuer = Configuration["Jwt:Issuer"],
// 受众
ValidAudience = Configuration["Jwt:Audience"],
// 签名密钥
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
};
});
// 添加控制器服务
services.AddControllers();
}
在此代码中,我们配置了 JWT 的验证机制。TokenValidationParameters 用于设置验证 JWT 的不同参数,例如发行者、受众、签名密钥等。
接下来,在 appsettings.json 中添加 JWT 的配置信息:
{
"Jwt": {
"Key": "your_secret_key", // 签名密钥
"Issuer": "your_issuer", // JWT 发行者
"Audience": "your_audience" // JWT 受众
}
}
3. 配置中间件
在 Configure 方法中,我们需要启用身份验证和授权中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage(); // 开发环境下的异常页面
}
app.UseRouting(); // 启用路由
app.UseAuthentication(); // 启用身份验证中间件
app.UseAuthorization(); // 启用授权中间件
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers(); // 映射控制器路由
});
}
以上代码确保了应用程序会对传入的请求进行身份验证和授权。
四、生成 JWT 令牌
为了在用户登录时生成 JWT 令牌,我们可以创建一个 API 端点。例如:
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
// 使用依赖注入的方式来获取配置信息
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
// 用户登录方法
[HttpPost("login")]
public IActionResult Login([FromBody] UserLoginDto loginDto)
{
// 简单的身份验证逻辑,仅为演示用途
if (loginDto.Username == "admin" && loginDto.Password == "password")
{
// 如果用户名和密码正确,生成 JWT 令牌
var token = GenerateJwtToken();
return Ok(new { token });
}
// 否则返回未经授权的状态
return Unauthorized();
}
// 生成 JWT 令牌的方法
private string GenerateJwtToken()
{
// 获取签名密钥
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
// 创建签名凭据
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
// 声明信息,包含用户标识
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, "admin"), // 用户标识
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) // 令牌唯一标识
};
// 创建 JWT 令牌
var token = new JwtSecurityToken(_configuration["Jwt:Issuer"],
_configuration["Jwt:Audience"],
claims,
expires: DateTime.Now.AddMinutes(30), // 令牌过期时间为30分钟
signingCredentials: credentials); // 使用签名凭据对令牌签名
// 返回令牌字符串
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
在这个控制器中,我们实现了一个简单的用户登录逻辑,并在登录成功时生成 JWT 令牌。GenerateJwtToken 方法负责生成和签名令牌。
五、使用 JWT 进行授权
生成的 JWT 令牌可以在客户端保存,并在访问受保护的 API 端点时通过请求头传递。
例如,在访问受保护的端点时,可以将令牌放入请求头的 Authorization 字段:
GET /api/protected-endpoint HTTP/1.1
Host: yourapi.com
Authorization: Bearer your_jwt_token
在 API 控制器中,可以通过 [Authorize] 属性来保护这些端点:
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class ProtectedController : ControllerBase
{
// 受保护的 API 端点,只有通过身份验证的用户才能访问
[HttpGet("data")]
public IActionResult GetData()
{
return Ok(new { message = "This is protected data" });
}
}
只有在请求头中包含有效的 JWT 令牌,用户才能访问这个受保护的端点。
六、总结
通过本文,我们学习了如何在 .NET Core 中集成 JWT 认证与授权,从配置 JWT 服务到生成令牌,再到使用 JWT 保护 API 端点。JWT 是一种强大且灵活的认证机制,广泛应用于现代 Web 应用中。理解和掌握 JWT 的使用,可以帮助我们构建更安全、更可靠的应用程序。