ASP.NET Core JWT认证与授权实战指南(含完整实现步骤与最佳实践)
2026-05-06 11 0
在现代Web API开发中,JWT(JSON Web Token)是一种非常常见的身份验证方式。它通过一个自包含的Token来完成用户身份验证和权限控制,避免了传统Session的状态依赖。
简单来说,JWT就像一张通行证:
- 登录成功后,服务器签发Token
- 客户端每次请求携带Token
- 服务器验证Token后决定是否放行
这种机制不仅提高了性能,还非常适合前后端分离、微服务架构。
在 ASP.NET Core 中,JWT通常用于保护API接口,通过Bearer Token的方式传递。
JWT认证的核心流程
JWT认证主要分为三个步骤:
- 用户登录(用户名 + 密码)
- 服务器生成JWT Token
- 客户端携带Token访问API
Token通常通过HTTP Header传递:
Authorization: Bearer {token}
服务器在每次请求时会验证Token的:
- 签名(防篡改)
- 过期时间
- 签发者(Issuer)
- 受众(Audience)
ASP.NET Core实现JWT认证
1. 安装依赖
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. 配置JWT认证(Program.cs)
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your_issuer",
ValidAudience = "your_audience",
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes("your_secret_key"))
};
});
builder.Services.AddAuthorization();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
3. 生成JWT Token
public string GenerateToken(string username)
{
var claims = new[]
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Role, "Admin")
};
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes("your_secret_key"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "your_issuer",
audience: "your_audience",
claims: claims,
expires: DateTime.Now.AddHours(1),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
4. 添加认证接口
[HttpPost("login")]
public IActionResult Login(LoginModel model)
{
if (model.Username == "admin" && model.Password == "123456")
{
var token = GenerateToken(model.Username);
return Ok(new { token });
}
return Unauthorized();
}
5. 使用授权保护接口
[Authorize]
[HttpGet("secure")]
public IActionResult SecureData()
{
return Ok("This is protected data");
}
如果未携带Token,会返回401。如果权限不足,会返回403。
JWT授权(Authorization)实现方式
在ASP.NET Core中,授权主要有三种方式:
1. 基于角色(Role-based)
[Authorize(Roles = "Admin")]
2. 基于策略(Policy-based)
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly",
policy => policy.RequireRole("Admin"));
});
使用:
[Authorize(Policy = "AdminOnly")]
3. 自定义Claims授权
JWT中的Claims可以携带用户权限信息,比如:
- 用户ID
- 角色
- 权限范围
服务器通过解析Claims进行细粒度控制。
进阶:Refresh Token机制
为了提升安全性,通常会配合Refresh Token:
- Access Token(短期有效)
- Refresh Token(长期有效)
流程:
- Access Token过期
- 使用Refresh Token换新Token
这种方式在 .NET 8及以上版本中非常常见。
最佳实践与注意事项
- 不要在客户端解析JWT(安全风险)
- 使用HTTPS传输Token
- 设置合理的过期时间
- 使用强密钥(至少256位)
- 推荐结合OAuth2 / OpenID Connect
总结
ASP.NET Core中的JWT认证与授权是一种高性能、无状态的安全机制,特别适合前后端分离项目、微服务架构、移动端API。通过合理设计Token结构与授权策略,可以实现既安全又灵活的访问控制体系。