ASP.NET Core 入门教学十三 使用JWT进行身份验证

目录
  1. JWT简介
  2. 安装必要的NuGet包
  3. 配置JWT身份验证
  4. 创建用户认证服务
  5. 生成和验证JWT令牌
  6. 保护API端点
  7. 刷新令牌机制
  8. 最佳实践
正文内容
1. JWT简介

JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。每一部分都是Base64编码的JSON字符串,并用点号(.)分隔。JWT的主要优点包括:

  • 自包含性:所有必要的信息都包含在令牌中,减少了服务器查询数据库的次数。
  • 安全性:通过签名确保数据的完整性和真实性。
  • 跨域支持:JWT可以在不同的域之间安全地传输。
2. 安装必要的NuGet包

首先,我们需要安装Microsoft.AspNetCore.Authentication.JwtBearer包,以便在ASP.NET Core中使用JWT。

 
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
3. 配置JWT身份验证

Startup.cs文件中,我们需要进行以下配置以启用JWT身份验证:

 
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // 配置JWT身份验证
    var key = Encoding.UTF8.GetBytes("your_secret_key"); // 替换为你的密钥
    services.AddAuthentication(x =>
    {
        x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(x =>
    {
        x.RequireHttpsMetadata = false;
        x.SaveToken = true;
        x.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(key),
            ValidateIssuer = false,
            ValidateAudience = false
        };
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    </tool>
4. 创建用户认证服务

我们需要创建一个用户认证服务来处理用户的登录请求并生成JWT令牌。

 
public class AuthService
{
    private readonly IConfiguration _configuration;
    private readonly IMapper _mapper;

    public AuthService(IConfiguration configuration, IMapper mapper)
    {
        _configuration = configuration;
        _mapper = mapper;
    }

    public async Task<string> LoginAsync(UserForLoginDto userForLoginDto)
    {
        // 验证用户凭据
        var userFromRepo = await _userRepository.Login(userForLoginDto.Username.ToLower(), userForLoginDto.Password);

        if (userFromRepo == null)
            throw new Exception("Invalid username/password");

        // 生成JWT令牌
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_configuration.GetSection("AppSettings:Token").Value);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.NameIdentifier, userFromRepo.Id.ToString()),
                new Claim(ClaimTypes.Name, userFromRepo.Username)
            }),
            Expires = DateTime.Now.AddDays(1),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        return tokenString;
    }
}
5. 生成和验证JWT令牌

在上面的AuthService中,我们已经展示了如何生成JWT令位,在Startup.cs文件中配置了如何验证JWT令牌。

6. 保护API端点

我们可以使用[Authorize]属性来保护API端点,确保只有经过身份验证的用户才能访问。

 
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    [HttpGet("{id}")]
    [Authorize]
    public async Task<IActionResult> Get(int id)
    {
        // 获取用户信息
    }
}
7. 刷新令牌机制

为了提高安全性,可以实现一个刷新令牌机制,允许用户在JWT令牌过期后获取新的令牌,而无需重新登录。

8. 最佳实践
  • 密钥管理:确保密钥的安全存储,不要硬编码在代码中。
  • 令牌过期时间:设置合理的令牌过期时间,平衡安全性和用户体验。
  • HTTPS:始终使用HTTPS来保护令牌在传输过程中的安全。
结语

通过本教程,我们学习了如何在ASP.NET Core项目中使用JWT实现安全的身份验证。JWT提供了一种强大且灵活的方式来管理用户身份和权限,希望你能将这些知识应用到实际项目中,提升应用的安全性和用户体验。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

充值内卷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值