返回

ASP.NET Core JWT认证与授权实战指南(含完整实现步骤与最佳实践)

2026-05-06 ASP.NET Core JWT 11 0

在现代Web API开发中,JWT(JSON Web Token)是一种非常常见的身份验证方式。它通过一个自包含的Token来完成用户身份验证和权限控制,避免了传统Session的状态依赖。

简单来说,JWT就像一张通行证:

  • 登录成功后,服务器签发Token
  • 客户端每次请求携带Token
  • 服务器验证Token后决定是否放行

这种机制不仅提高了性能,还非常适合前后端分离、微服务架构。

在 ASP.NET Core 中,JWT通常用于保护API接口,通过Bearer Token的方式传递。

JWT认证的核心流程

JWT认证主要分为三个步骤:

  1. 用户登录(用户名 + 密码)
  2. 服务器生成JWT Token
  3. 客户端携带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(长期有效)

流程:

  1. Access Token过期
  2. 使用Refresh Token换新Token

这种方式在 .NET 8及以上版本中非常常见。

最佳实践与注意事项

  • 不要在客户端解析JWT(安全风险)
  • 使用HTTPS传输Token
  • 设置合理的过期时间
  • 使用强密钥(至少256位)
  • 推荐结合OAuth2 / OpenID Connect

总结

ASP.NET Core中的JWT认证与授权是一种高性能、无状态的安全机制,特别适合前后端分离项目、微服务架构、移动端API。通过合理设计Token结构与授权策略,可以实现既安全又灵活的访问控制体系。

顶部