.NET Core实现JWT认证步骤

在.NET Core中实现JWT认证的关键步骤如下:


1. 安装必要的NuGet包

  • Microsoft.AspNetCore.Authentication.JwtBearer:用于JWT认证中间件。
  • System.IdentityModel.Tokens.Jwt:用于生成和验证JWT Token。
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

2. 配置JWT参数

appsettings.json 中添加JWT配置项:

{
  "Jwt": {
    "Key": "YourSecretKeyAtLeast256BitsLong", // 安全密钥(推荐256位以上)
    "Issuer": "https://yourdomain.com",       // 颁发者
    "Audience": "your_audience",              // 受众
    "ExpireMinutes": 60                       // 有效期(分钟)
  }
}

3. 注册JWT认证服务

Program.cs 中配置JWT认证:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// 注册JWT服务
builder.Services.AddAuthentication(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();

4. 创建登录接口生成Token

创建登录接口,验证用户后生成JWT Token:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public AuthController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpPost("login")]
    public IActionResult Login([FromBody] LoginModel user)
    {
        // 1. 验证用户身份(示例代码,需替换实际验证逻辑)
        if (user.Username != "admin" || user.Password != "123") 
            return Unauthorized();

        // 2. 生成Token
        var claims = new[]
        {
            new Claim(ClaimTypes.Name, user.Username),
            new Claim(ClaimTypes.Role, "Admin") // 添加角色声明
        };

        var key = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: _configuration["Jwt:Issuer"],
            audience: _configuration["Jwt:Audience"],
            claims: claims,
            expires: DateTime.Now.AddMinutes(Convert.ToDouble(_configuration["Jwt:ExpireMinutes"])),
            signingCredentials: credentials);

        return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
    }
}

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

5. 启用认证和授权中间件

Program.cs 中确保中间件顺序正确:

var app = builder.Build();

// 启用认证和授权中间件(顺序不能错!)
app.UseAuthentication();
app.UseAuthorization();

// 其他中间件配置...
app.MapControllers();
app.Run();

6. 使用[Authorize]保护API

在需要认证的Controller或Action上添加 [Authorize]

[ApiController]
[Route("api/[controller]")]
[Authorize] // 整个Controller需要认证
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult GetSecureData()
    {
        return Ok("This is protected data.");
    }

    [HttpGet("admin")]
    [Authorize(Roles = "Admin")] // 仅允许角色为Admin的用户访问
    public IActionResult AdminOnly()
    {
        return Ok("Admin access granted.");
    }
}

关键注意事项

  • 密钥安全:生产环境应使用安全方式存储密钥(如环境变量、Azure Key Vault)。
  • HTTPS:始终通过HTTPS传输Token。
  • Token有效期:根据安全需求设置合理的过期时间。
  • Claims设计:避免在Token中存储敏感信息。

通过以上步骤,即可在.NET Core中实现基于JWT的身份认证与授权。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jingzhi. Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值