设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 380|回复: 0

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:16
  • 打卡月天数:0
  • 打卡总奖励:260
  • 最近打卡:2023-12-24 17:26:51
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
35
主题
31
精华
0
金钱
374
积分
80
注册时间
2023-8-13
最后登录
2025-8-31

发表于 2025-8-31 10:40:04 | 显示全部楼层 |阅读模式

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 的格式通常是:

  1. Header.Payload.Signature
复制代码

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

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

1. 安装所需 NuGet 包

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

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

使用以下命令安装:

  1. dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
  2. dotnet add package System.IdentityModel.Tokens.Jwt
复制代码

2. 配置 JWT 认证服务

在 .NET 8 中,配置 JWT 认证服务的步骤已经简化,不再需要 

  1. Startup.cs
复制代码
 文件,所有配置都可以在 
  1. Program.cs
复制代码
 中完成。

打开 

  1. Program.cs
复制代码
 文件并添加如下配置:

  1. using Microsoft.AspNetCore.Authentication.JwtBearer;
  2. using Microsoft.IdentityModel.Tokens;
  3. using System.Text;
  4. var builder = WebApplication.CreateBuilder(args);
  5. // 获取 JWT 配置信息
  6. var jwtSecretKey = builder.Configuration["Jwt:SecretKey"];
  7. var jwtIssuer = builder.Configuration["Jwt:Issuer"];
  8. var jwtAudience = builder.Configuration["Jwt:Audience"];
  9. // 注册 JWT 认证服务
  10. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  11. .AddJwtBearer(options =>
  12. {
  13. options.TokenValidationParameters = new TokenValidationParameters
  14. {
  15. ValidIssuer = jwtIssuer, // 发行者
  16. ValidAudience = jwtAudience, // 受众
  17. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecretKey)), // 签名密钥
  18. ValidateIssuer = true, // 验证发行者
  19. ValidateAudience = true, // 验证受众
  20. ValidateLifetime = true, // 验证过期时间
  21. ClockSkew = TimeSpan.Zero // 设置允许的时间偏差,默认是5分钟
  22. };
  23. });
  24. builder.Services.AddAuthorization();
  25. builder.Services.AddControllers();
  26. var app = builder.Build();
  27. // 启用认证中间件
  28. app.UseAuthentication();
  29. // 启用授权中间件
  30. app.UseAuthorization();
  31. // 配置路由
  32. app.MapControllers();
  33. app.Run();
复制代码

配置解释:

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

3. 生成 JWT 令牌

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

  1. using Microsoft.IdentityModel.Tokens;
  2. using System.IdentityModel.Tokens.Jwt;
  3. using System.Security.Claims;
  4. using System.Text;
  5. public class JwtTokenService
  6. {
  7. private readonly string _secretKey;
  8. private readonly string _issuer;
  9. private readonly string _audience;
  10. public JwtTokenService(IConfiguration configuration)
  11. {
  12. _secretKey = configuration["Jwt:SecretKey"];
  13. _issuer = configuration["Jwt:Issuer"];
  14. _audience = configuration["Jwt:Audience"];
  15. }
  16. // 生成 JWT 令牌
  17. public string GenerateToken(string username)
  18. {
  19. var claims = new List<Claim>
  20. {
  21. new Claim(ClaimTypes.Name, username), // 用户名
  22. new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) // JWT ID
  23. };
  24. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secretKey));
  25. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  26. var token = new JwtSecurityToken(
  27. issuer: _issuer, // 发行者
  28. audience: _audience, // 受众
  29. claims: claims,
  30. expires: DateTime.Now.AddHours(1), // 设置有效期为1小时
  31. signingCredentials: creds // 签名凭证
  32. );
  33. return new JwtSecurityTokenHandler().WriteToken(token); // 返回生成的JWT
  34. }
  35. }
复制代码

生成 JWT 的步骤:

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

4. 保护 API 资源

一旦我们配置了 JWT 认证,我们就可以在需要保护的 API 上使用 

  1. [Authorize]
复制代码
 特性。这意味着只有携带有效 JWT 的用户才能访问这些受保护的 API。

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

  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. [Authorize] // 只有认证通过的用户才能访问
  4. [Route("api/[controller]")]
  5. [ApiController]
  6. public class SecureController : ControllerBase
  7. {
  8. [HttpGet]
  9. public IActionResult GetProtectedData()
  10. {
  11. return Ok(new { message = "This is a protected resource." });
  12. }
  13. }
复制代码

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

  1. 401 Unauthorized
复制代码
 响应。

5. 客户端发送 JWT

客户端需要将 JWT 添加到 HTTP 请求头的 

  1. Authorization
复制代码
 字段中。请求格式如下:

  1. Authorization: Bearer <your-jwt-token>
复制代码

客户端通常会在 

  1. localStorage
复制代码
 或 
  1. sessionStorage
复制代码
 中存储 JWT,并在每次访问受保护资源时通过请求头发送 JWT。

6. 配置应用设置

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

  1. appsettings.json
复制代码
 文件中:

  1. {
  2. "Jwt": {
  3. "SecretKey": "your-256-bit-secret",
  4. "Issuer": "yourIssuer",
  5. "Audience": "yourAudience"
  6. }
  7. }
复制代码

7. 刷新 JWT

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

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

三、总结

在 .NET 8 中,JWT 提供了一种高效且无状态的方式来进行身份认证和授权。通过 

  1. Program.cs
复制代码
 文件中的配置,我们可以轻松实现 JWT 验证、生成和保护 API 的功能。此外,JWT 的无状态特性使得它在分布式系统和微服务架构中非常有用。

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

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

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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表