.NET8中使用JWT进行身份认证和授权的实现

 更新时间:2025年05月31日 08:55:47   作者:江沉晚呤时  
本文主要介绍了.NET8中使用JWT进行身份认证和授权的实现,包括JWT组成、配置流程、令牌生成、API保护及刷新机制,具有一定的参考价值,感兴趣的可以了解一下

JSON Web Token(JWT)是一种非常流行的身份认证和授权方式,广泛应用于 Web 应用和微服务架构中。它允许不同系统或服务之间安全地传输信息。JWT 具有无状态的特性,能够简化认证过程,并使得系统具备更好的扩展性。在 .NET 8 中,使用 JWT 进行身份认证和授权变得更加简便和高效。本篇文章将详细介绍如何在 .NET 8 中使用 JWT。

一、什么是 JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在不同方之间传递安全信息。它由三部分组成:

  • Header(头部):包含令牌的类型和签名算法(如 HMAC SHA256 或 RSA)。
  • Payload(载荷):包含声明(Claims),声明可以是关于实体的信息(如用户)或其他数据。
  • Signature(签名):通过加密方式对 Header 和 Payload 进行签名,以确保 JWT 的完整性,防止数据被篡改。

JWT 的格式通常是:

Header.Payload.Signature

其中,Header 和 Payload 是 Base64Url 编码的字符串,而 Signature 是通过加密算法生成的数字签名。

二、JWT 在 .NET 8 中的使用流程

1. 安装所需 NuGet 包

首先,在 .NET 8 项目中,需要安装两个关键的 NuGet 包:

  • Microsoft.AspNetCore.Authentication.JwtBearer:用于处理 JWT 认证的中间件。
  • System.IdentityModel.Tokens.Jwt:用于生成和解析 JWT 令牌。

使用以下命令安装:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package System.IdentityModel.Tokens.Jwt

2. 配置 JWT 认证服务

在 .NET 8 中,配置 JWT 认证服务的步骤已经简化,不再需要 Startup.cs 文件,所有配置都可以在 Program.cs 中完成。

打开 Program.cs 文件并添加如下配置:

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

var builder = WebApplication.CreateBuilder(args);

// 获取 JWT 配置信息
var jwtSecretKey = builder.Configuration["Jwt:SecretKey"];
var jwtIssuer = builder.Configuration["Jwt:Issuer"];
var jwtAudience = builder.Configuration["Jwt:Audience"];

// 注册 JWT 认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidIssuer = jwtIssuer, // 发行者
            ValidAudience = jwtAudience, // 受众
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecretKey)), // 签名密钥
            ValidateIssuer = true, // 验证发行者
            ValidateAudience = true, // 验证受众
            ValidateLifetime = true, // 验证过期时间
            ClockSkew = TimeSpan.Zero // 设置允许的时间偏差,默认是5分钟
        };
    });

builder.Services.AddAuthorization();
builder.Services.AddControllers();

var app = builder.Build();

// 启用认证中间件
app.UseAuthentication();

// 启用授权中间件
app.UseAuthorization();

// 配置路由
app.MapControllers();

app.Run();

配置解释:

  • Jwt:SecretKeyJwt:IssuerJwt:Audience:从 appsettings.json 配置文件中读取密钥、发行者和受众。
  • AddAuthentication(JwtBearerDefaults.AuthenticationScheme):告诉应用使用 JWT 认证方式。
  • TokenValidationParameters:设置 JWT 的验证规则,包括验证发行者、受众、签名密钥等。

3. 生成 JWT 令牌

生成 JWT 令牌通常发生在用户登录时,成功验证用户身份后,后端会生成并返回 JWT 令牌。在 .NET 8 中,我们可以通过以下方式生成 JWT 令牌:

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

public class JwtTokenService
{
    private readonly string _secretKey;
    private readonly string _issuer;
    private readonly string _audience;

    public JwtTokenService(IConfiguration configuration)
    {
        _secretKey = configuration["Jwt:SecretKey"];
        _issuer = configuration["Jwt:Issuer"];
        _audience = configuration["Jwt:Audience"];
    }

    // 生成 JWT 令牌
    public string GenerateToken(string username)
    {
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username), // 用户名
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) // JWT ID
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secretKey));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: _issuer, // 发行者
            audience: _audience, // 受众
            claims: claims,
            expires: DateTime.Now.AddHours(1), // 设置有效期为1小时
            signingCredentials: creds // 签名凭证
        );

        return new JwtSecurityTokenHandler().WriteToken(token); // 返回生成的JWT
    }
}

生成 JWT 的步骤:

  • 创建 Claims(声明),例如用户名和 JWT ID。
  • 使用对称密钥(SymmetricSecurityKey)对 JWT 进行签名。
  • 设置有效期、发行者和受众,并使用 JwtSecurityTokenHandler 来生成 JWT 令牌。

4. 保护 API 资源

一旦我们配置了 JWT 认证,我们就可以在需要保护的 API 上使用 [Authorize] 特性。这意味着只有携带有效 JWT 的用户才能访问这些受保护的 API。

例如,下面是一个受保护的控制器:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Authorize] // 只有认证通过的用户才能访问
[Route("api/[controller]")]
[ApiController]
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult GetProtectedData()
    {
        return Ok(new { message = "This is a protected resource." });
    }
}

[Authorize] 特性:该特性用于标记需要授权的 API。只有经过身份验证的用户才能访问这些资源。如果用户未提供有效 JWT 或 JWT 已过期,系统将返回 401 Unauthorized 响应。

5. 客户端发送 JWT

客户端需要将 JWT 添加到 HTTP 请求头的 Authorization 字段中。请求格式如下:

Authorization: Bearer <your-jwt-token>

客户端通常会在 localStorage 或 sessionStorage 中存储 JWT,并在每次访问受保护资源时通过请求头发送 JWT。

6. 配置应用设置

为了保持应用的灵活性,JWT 密钥、发行者和受众等信息通常会存储在 appsettings.json 文件中:

{
  "Jwt": {
    "SecretKey": "your-256-bit-secret",
    "Issuer": "yourIssuer",
    "Audience": "yourAudience"
  }
}

7. 刷新 JWT

JWT 通常具有较短的有效期(例如 1 小时),但为了提升用户体验,我们可以实现一个刷新令牌机制,允许用户在 JWT 过期后通过刷新令牌获取新的 JWT。

刷新令牌通常是长期有效的,直到用户注销或令牌被撤销。实现刷新令牌的过程比较复杂,涉及到生成和验证刷新令牌等逻辑,但它是许多现代 Web 应用程序和 API 中常见的身份验证模式。

三、总结

在 .NET 8 中,JWT 提供了一种高效且无状态的方式来进行身份认证和授权。通过 Program.cs 文件中的配置,我们可以轻松实现 JWT 验证、生成和保护 API 的功能。此外,JWT 的无状态特性使得它在分布式系统和微服务架构中非常有用。

整个 JWT 身份验证的流程包括:

  • 配置 JWT 认证服务。
  • 在用户登录时生成 JWT。
  • 客户端携带 JWT 请求受保护的 API。
  • 后端验证 JWT 的有效性并进行授权。

JWT 的使用使得系统更加轻量级,避免了服务器存储会话信息,特别适用于现代 Web 应用、SPA 和微服务架构。

到此这篇关于.NET8中使用JWT进行身份认证和授权的实现的文章就介绍到这了,更多相关.NET8 JWT身份认证和授权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Tomcat ClassLoader打破双亲委派源码解析

    Tomcat ClassLoader打破双亲委派源码解析

    这篇文章主要为大家介绍了Tomcat ClassLoader打破双亲委派源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Mybatis如何实现InsertOrUpdate功能

    Mybatis如何实现InsertOrUpdate功能

    这篇文章主要介绍了Mybatis如何实现InsertOrUpdate功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • SpringMVC如何域对象共享数据

    SpringMVC如何域对象共享数据

    在Spring MVC中,可以使用域对象来共享数据,域对象是一个Map类型的对象,可以在请求处理方法之间共享数据,本文给大家介绍SpringMVC 域对象共享数据的示例代码,一起看看吧
    2023-09-09
  • Java 静态绑定与动态绑定深入分析

    Java 静态绑定与动态绑定深入分析

    这篇文章主要介绍了Java 静态绑定与动态绑定深入分析的相关资料,这里对java 的动态绑定和静态绑定做了详细的介绍,对其进行总结整理,需要的朋友可以参考下
    2016-11-11
  • Java并发编程之线程状态介绍

    Java并发编程之线程状态介绍

    这篇文章主要介绍了Java并发编程之线程状态,当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,下面和小编一起进入文章了解具体的相关介绍吧
    2022-04-04
  • Java实现Map集合二级联动示例

    Java实现Map集合二级联动示例

    Java实现Map集合二级联动示例,需要的朋友可以参考下
    2014-03-03
  • Java实现图片转换PDF文件的示例代码

    Java实现图片转换PDF文件的示例代码

    这篇文章主要介绍了Java实现图片转换PDF文件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot文件上传控制及Java 获取和判断文件头信息

    SpringBoot文件上传控制及Java 获取和判断文件头信息

    这篇文章主要介绍了SpringBoot文件上传控制的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • springboot如何接收get和post请求参数

    springboot如何接收get和post请求参数

    这篇文章主要介绍了springboot如何接收get和post请求参数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • SpringBoot整合Aop全过程

    SpringBoot整合Aop全过程

    AOP(面向切面编程)技术可以高效地解决日志记录、事务管理、权限控制等问题,日志记录通过自定义注解和切面类,自动记录方法调用详情,减少重复代码,事务管理方面,通过AOP可以在不改变业务代码的情况下,实现事务的自动开启、提交和回滚,保证数据一致性
    2024-10-10

最新评论