商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > .NET8中使用JWT进行身份认证和授权的实现

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

  发布于2026-07-23 阅读(0)

扫一扫,手机访问

在后台开发中,聊到身份认证,JWT几乎是绕不开的话题。JSON Web Token(JWT)提供了一种既高效又无状态的方式来在不同系统之间安全地传递信息,特别适合现代Web应用和微服务架构。它最大的好处就是简化了认证流程,让系统扩展起来更轻松。而在.NET 8中,集成JWT认证和授权,比以往任何版本都更直接、更顺手。这篇文章就来一步步拆解这个过程。

一、什么是JWT?

JWT(JSON Web Token)本质上是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。你可能会问,它到底长什么样?简单来说,它由三部分拼接而成:

  • Header(头部):通常包含令牌的类型(JWT)和使用的签名算法,比如HMAC SHA256或者RSA。
  • Payload(载荷):这里存放的是具体的“声明”(Claims),也就是关于实体(比如用户)和其他数据的描述信息。
  • Signature(签名):这是最关键的部分,通过指定的算法对Header和Payload进行加密签名,确保数据在传输过程中没有被篡改。

最终的格式就像这样:

Header.Payload.Signature

其中Header和Payload是Base64Url编码的,而Signature则是加密后的数字签名。

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

1. 安装所需 NuGet 包

动手之前,先得把工具准备好。在你的.NET 8项目中,需要引入两个核心库:

  • 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的一个舒服之处——不再需要单独的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
        };
    });

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

var app = builder.Build();

// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();
app.Run();

这段配置其实在说几件事:

  • 密钥、发行者、受众这些信息,都从appsettings.json里读取,方便后续调整。
  • AddAuthentication(JwtBearerDefaults.AuthenticationScheme)告诉应用:我就要用JWT来认证。
  • TokenValidationParameters则定义了具体的验证规则,比如要不要验证发行者、受众、令牌是否过期等。这里把ClockSkew设为零,意味着令牌过期时间到了就立即失效,不留缓冲。

3. 生成 JWT 令牌

生成令牌的时机通常是在用户登录成功后。验证通过,后端就签发一个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"];
    }

    public string GenerateToken(string username)
    {
        var claims = new List
        {
            new Claim(ClaimTypes.Name, username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        };

        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),
            signingCredentials: creds
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

逻辑很清晰:先构造声明(Claims),比如用户名和唯一的JWT ID;然后用对称密钥生成签名;最后指定有效期——这里设为1小时。通过JwtSecurityTokenHandler写入并返回一个字符串格式的JWT。

4. 保护 API 资源

有了JWT认证的配置,保护API就变得非常简单了。只需要在需要认证的控制器或方法上加上[Authorize]特性:

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." });
    }
}

加了这个特性之后,所有访问该控制器的请求都必须携带一个有效的JWT。如果令牌缺失、过期或者无效,服务端会直接返回401 Unauthorized

5. 客户端发送 JWT

客户端这边,每次请求受保护的资源时,都需要在HTTP请求头中带上JWT,格式如下:

Authorization: Bearer 

通常的做法是把令牌存在localStoragesessionStorage里,然后在发起请求时手动拼接这个Header。

6. 配置应用设置

为了保持灵活性,密钥、发行者、受众这些信息,最好放在appsettings.json里:

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

7. 刷新 JWT

JWT的有效期通常不会太长,但为了提升用户体验,刷新令牌机制几乎是标配。简单来说,就是提供一个长期有效的刷新令牌,让用户在JWT过期后用它来换取一个新的JWT,避免频繁登录。实现起来会涉及更多逻辑,比如生成和验证刷新令牌、存储和管理等,但这是现代Web应用和API中非常常见的做法。

三、总结

在.NET 8中,JWT提供了一种干净、无状态的身份认证和授权方案。通过Program.cs中的集中配置,我们可以轻松地实现JWT的验证、生成以及对API的保护。整个流程大致可以概括为:

  • 配置JWT认证服务。
  • 用户登录时生成JWT令牌。
  • 客户端携带令牌请求受保护的API。
  • 服务端验证令牌并完成授权。

因为不需要在服务端存储会话信息,JWT让系统变得更加轻量,特别适合分布式系统、SPA(单页应用)和微服务架构。

本文转载于:https://www.jb51.net/aspnet/342647vdz.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注