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

相关推荐
吃海鲜的骆驼2 分钟前
服务异步通讯与RabbitMQ
java·分布式·后端·rabbitmq
m0_748233644 分钟前
RabbitMQ 进阶
android·前端·后端
m0_7482386313 分钟前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
菜鸟阿达1 小时前
spring boot 2.7 + seata +微服务 降级失败问题修复
spring boot·后端·微服务
清河__1 小时前
【Go】十七、grpc 服务的具体功能编写
开发语言·后端·golang
张声录12 小时前
国密算法Sm2工具类--golang实现版
开发语言·后端·golang
cwtlw9 小时前
PhotoShop学习01
笔记·学习·ui·photoshop
一小路一10 小时前
从0-1学习Mysql第五章: 索引与优化
数据库·后端·学习·mysql·面试
mah66610 小时前
SpringBoot项目连接Oracle视图报错整理
spring boot·后端·oracle
IT学长编程11 小时前
计算机毕业设计 基于SpringBoot的智慧社区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·后端·毕业设计·课程设计·论文笔记·1024程序员节