JWT即JSON Web Token,是一种轻量级的身份认证方案,在ASP.NET Core项目中可以通过集成JWT相关组件实现无状态的登录Token鉴权,避免传统Session方案带来的服务器存储压力。整个实现过程主要分为依赖安装、服务配置、Token生成、中间件启用、接口鉴权几个核心步骤。
一、安装必要的NuGet包
首先需要在ASP.NET Core项目中安装JWT相关的依赖包,打开NuGet包管理器,搜索并安装以下两个包:
- Microsoft.AspNetCore.Authentication.JwtBearer
- System.IdentityModel.Tokens.Jwt
如果是使用命令行安装,可以执行以下命令:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package System.IdentityModel.Tokens.Jwt
二、配置JWT服务
接下来需要在项目的Program.cs文件中配置JWT相关的服务,设置密钥、发行者、接收者、过期时间等参数。
1. 添加配置项
先在appsettings.json中添加JWT的配置信息:
{
"JwtSettings": {
"SecretKey": "ThisIsASecureSecretKeyForJwtDemo123456",
"Issuer": "JwtDemoIssuer",
"Audience": "JwtDemoAudience",
"ExpiryMinutes": 30
}
}
2. 注册JWT服务
在Program.cs中读取配置并注册JWT认证服务:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
// 读取JWT配置
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["SecretKey"];
var issuer = jwtSettings["Issuer"];
var audience = jwtSettings["Audience"];
var expiryMinutes = int.Parse(jwtSettings["ExpiryMinutes"]);
// 注册JWT认证服务
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// 验证密钥
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)),
// 验证发行者
ValidateIssuer = true,
ValidIssuer = issuer,
// 验证接收者
ValidateAudience = true,
ValidAudience = audience,
// 验证过期时间
ValidateLifetime = true,
// 过期时间偏移量,设置为0避免时钟偏差问题
ClockSkew = TimeSpan.Zero
};
});
builder.Services.AddControllers();
var app = builder.Build();
三、生成JWT Token
登录接口验证用户账号密码通过后,需要生成JWT Token返回给客户端,以下是生成Token的示例代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _configuration;
public AuthController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginRequest request)
{
// 这里模拟账号密码验证,实际项目中需要查询数据库验证
if (request.Username != "admin" || request.Password != "123456")
{
return BadRequest("账号或密码错误");
}
// 读取JWT配置
var jwtSettings = _configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["SecretKey"];
var issuer = jwtSettings["Issuer"];
var audience = jwtSettings["Audience"];
var expiryMinutes = int.Parse(jwtSettings["ExpiryMinutes"]);
// 定义Token包含的声明信息
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, request.Username),
new Claim(ClaimTypes.Role, "Admin"),
new Claim("UserId", "1001")
};
// 创建密钥和签名凭证
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
// 生成Token
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.Now.AddMinutes(expiryMinutes),
signingCredentials: creds
);
// 返回Token字符串
return Ok(new
{
Token = new JwtSecurityTokenHandler().WriteToken(token),
Expiry = expiryMinutes
});
}
}
// 登录请求参数类
public class LoginRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
四、启用认证中间件
服务注册完成后,需要在Program.cs中启用认证和授权中间件,注意中间件的顺序,必须放在UseAuthorization之前,UseRouting之后:
// 启用路由 app.UseRouting(); // 启用认证中间件 app.UseAuthentication(); // 启用授权中间件 app.UseAuthorization(); app.MapControllers(); app.Run();
五、接口添加鉴权特性
需要在需要鉴权的接口或者控制器上添加[Authorize]特性,没有携带有效Token的请求会被拦截返回401状态码:
[ApiController]
[Route("api/[controller]")]
[Authorize] // 整个控制器下的接口都需要鉴权
public class UserController : ControllerBase
{
[HttpGet("info")]
public IActionResult GetUserInfo()
{
// 从Token中读取用户信息
var username = User.Identity.Name;
var userId = User.FindFirst("UserId")?.Value;
var role = User.FindFirst(ClaimTypes.Role)?.Value;
return Ok(new
{
Username = username,
UserId = userId,
Role = role
});
}
[HttpGet("public")]
[AllowAnonymous] // 该接口允许匿名访问,不需要Token
public IActionResult PublicApi()
{
return Ok("这是一个公开接口");
}
}
六、注意事项
- SecretKey的长度不能太短,建议至少32位,避免被暴力破解
- 生产环境中不要将密钥等敏感信息硬编码在代码里,建议使用环境变量或者配置中心存储
- Token过期后需要客户端重新调用登录接口获取新Token,也可以实现刷新Token机制延长登录状态
- 如果接口需要区分不同角色的权限,可以在
[Authorize]特性中指定角色,例如[Authorize(Roles = "Admin")]
JWT是无状态Token,一旦签发在过期前无法主动销毁,因此不要将敏感信息放在Token的声明中,避免信息泄露。
C#JWT身份认证ASP.NET_CoreToken鉴权修改时间:2026-07-07 17:45:36