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身份验证:

复制代码
cs 复制代码
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令牌。

复制代码
cs 复制代码
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提供了一种强大且灵活的方式来管理用户身份和权限,希望你能将这些知识应用到实际项目中,提升应用的安全性和用户体验。

相关推荐
文心快码BaiduComate7 分钟前
文心快码3.5S实测插件开发,Architect模式令人惊艳
前端·后端·架构
5pace12 分钟前
【JavaWeb|第二篇】SpringBoot篇
java·spring boot·后端
HenryLin13 分钟前
Kronos核心概念解析
后端
oak隔壁找我13 分钟前
Spring AOP源码深度解析
java·后端
货拉拉技术16 分钟前
大规模 Kafka 消费集群调度方案
后端
oak隔壁找我16 分钟前
MyBatis Plus 源码深度解析
java·后端
oak隔壁找我16 分钟前
Druid 数据库连接池源码详细解析
java·数据库·后端
剽悍一小兔17 分钟前
Nginx 基本使用配置大全
后端
LCG元17 分钟前
性能排查必看!当Linux服务器CPU/内存飙高,如何快速定位并"干掉"罪魁祸首进程?
linux·后端
oak隔壁找我18 分钟前
MyBatis 源码深度解析
java·后端