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

来源:这里教程网 时间:2026-02-21 17:32:52 作者:

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

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

相关推荐