天衣有缝 发表于 2024-11-1 19:09:55

深入解析:JWT Bearer 认证在 .NET Core 中的应用

在现代 Web 应用中,安全认证是确保用户数据和系统安全的重要一环。JSON Web Token (JWT) 是一种流行的认证方式,它可以在客户端和服务端之间安全地传递信息。本文将详细介绍 JWT Bearer 认证的概念、工作原理、在 .NET Core 中的实现步骤,以及最佳实践。
一、什么是 JWT?

JSON Web Token (JWT) 是一个开放标准(RFC 7519),用于以安全的方式在网络应用环境中传递声明信息。JWT 的基本结构由三个部分组成:

[*]头部 (Header):通常包含令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256)。
[*]负载 (Payload):包含要传递的数据,称为声明 (Claims),可以是关于用户的信息或其他元数据。
[*]签名 (Signature):通过将编码后的头部和负载与一个密钥结合,使用指定的算法生成的签名,用于验证令牌的真实性。
JWT 的结构示例如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c二、JWT Bearer 认证的工作原理

在 JWT Bearer 认证中,用户通过提供凭据(如用户名和密码)进行身份验证。以下是基本的工作流程:

[*]用户登录:用户发送登录请求,附带用户名和密码。
[*]生成 JWT:服务器验证凭据后生成 JWT,并将其返回给用户。
[*]使用 JWT:用户在后续的 API 请求中,将 JWT 作为 Bearer Token 发送。
[*]验证 JWT:服务器接收到请求后,验证 JWT 的有效性。如果有效,则允许访问相应的资源。
JWT 的优势在于它是自包含的,包含了所有用户所需的信息,无需在服务器上存储会话状态。
三、在 .NET Core 中实现 JWT Bearer 认证

1. 安装所需 NuGet 包

在您的 .NET Core 项目中安装 JWT Bearer 认证所需的 NuGet 包:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer<br>dotnet add package System.IdentityModel.Tokens.Jwt2. 配置 JWT 认证服务

在 Program.cs 文件中配置 JWT Bearer 认证。以下是完整示例:
using Microsoft.AspNetCore.Authentication.JwtBearer;<br>using Microsoft.IdentityModel.Tokens;<br>using System.Text;<br>​<br>var builder = WebApplication.CreateBuilder(args);<br>​<br>// 读取 JWT 配置<br>var jwtSection = builder.Configuration.GetSection("JwtSettings");<br>var key = jwtSection.GetValue<string>("Key");<br>var issuer = jwtSection.GetValue<string>("Issuer");<br>var audience = jwtSection.GetValue<string>("Audience");<br>​<br>// 配置 JWT 认证<br>builder.Services.AddAuthentication(options =><br>{<br>    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;<br>    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;<br>})<br>.AddJwtBearer(options =><br>{<br>    options.TokenValidationParameters = new TokenValidationParameters<br>  {<br>        ValidateIssuer = true,<br>        ValidateAudience = true,<br>        ValidateLifetime = true,<br>        ValidateIssuerSigningKey = true,<br>        ValidIssuer = issuer,<br>        ValidAudience = audience,<br>        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))<br>  };<br>});<br>​<br>builder.Services.AddControllers();<br>​<br>var app = builder.Build();<br>​<br>app.UseAuthentication(); // 使用认证中间件<br>app.UseAuthorization();  // 使用授权中间件<br>​<br>app.MapControllers(); // 映射控制器<br>​<br>app.Run();3. 在 appsettings.json 中配置 JWT 设置

在 appsettings.json 中添加 JWT 的配置:
{<br>  "JwtSettings": {<br>    "Key": "dsggdgewt3452345sbvsdgsdfsvxGHLKGFFJHLL",  // 生成 JWT 所用的密钥<br>    "Issuer": "mywebapiTest",         // JWT 的颁发者<br>    "Audience": "mywebapiTest"       // JWT 的接收者<br>},<br>  "AllowedHosts": "*"<br>}4. 生成 JWT

在用户成功登录后生成 JWT。可以创建一个控制器处理登录请求:
using Microsoft.AspNetCore.Mvc;<br>using Microsoft.IdentityModel.Tokens;<br>using System.IdentityModel.Tokens.Jwt;<br>using System.Security.Claims;<br>using System.Text;<br>​<br>namespace MyApp.Controllers<br>{<br>  <br>  ")]<br>    public class AuthController : ControllerBase<br>  {<br>        private readonly IConfiguration _configuration;<br>​<br>        public AuthController(IConfiguration configuration)<br>      {<br>            _configuration = configuration;<br>      }<br>​<br>      <br>        public IActionResult Login( LoginModel login)<br>      {<br>            // 验证用户身份(示例中使用简单的硬编码,实际应调用数据库验证)<br>            if (login.Username == "test" && login.Password == "password")<br>          {<br>                var claims = new[]<br>              {<br>                    new Claim(ClaimTypes.Name, login.Username)<br>              };<br>​<br>                var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSettings:Key"]));<br>                var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);<br>​<br>                var token = new JwtSecurityToken(<br>                    issuer: _configuration["JwtSettings:Issuer"],<br>                    audience: _configuration["JwtSettings:Audience"],<br>                    claims: claims,<br>                    expires: DateTime.Now.AddMinutes(30), // 设置过期时间<br>                    signingCredentials: creds);<br>​<br>                return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });<br>          }<br>​<br>            return Unauthorized(); // 认证失败<br>      }<br>  }<br>​<br>    public class LoginModel<br>  {<br>        public string Username { get; set; }<br>        public string Password { get; set; }<br>  }<br>}5. 保护 API 端点

可以通过 特性保护需要身份验证的 API 端点:
using Microsoft.AspNetCore.Authorization;<br>using Microsoft.AspNetCore.Mvc;<br>​<br>namespace MyApp.Controllers<br>{<br>  <br>  ")]<br>    public class WeatherForecastController : ControllerBase<br>  {<br>       // 保护此 API<br>      <br>        public IActionResult Get()<br>      {<br>            return Ok(new { Weather = "Sunny" });<br>      }<br>  }<br>}四、测试 JWT Bearer 认证


[*]登录:发送 POST 请求到 /api/auth/login,使用 JSON 格式的用户名和密码进行身份验证。成功后将返回一个 JWT。
示例请求体:
{<br>    "username": "test",<br>    "password": "password"<br>}
[*]访问受保护的 API:在请求头中添加 Authorization 字段,格式为 Bearer {token}。
示例请求:
GET /weatherforecast HTTP/1.1<br>Authorization: Bearer {your_token}
五、最佳实践


[*]密钥管理:确保 JWT 的密钥安全,不要将其硬编码在代码中。可以使用环境变量或密钥管理服务。
[*]过期时间:合理设置 JWT 的过期时间,以防长期有效的令牌被滥用。
[*]黑名单机制:在用户注销或更改密码时,考虑实现黑名单机制,以便失效旧的 JWT。
[*]HTTPS:始终通过 HTTPS 传输 JWT,防止中间人攻击。
六、总结

JWT Bearer 认证为 .NET Core 应用程序提供了一种简单、安全的身份验证方式。通过本教程,您可以了解如何在 .NET Core 中实现 JWT 认证,从基本配置到实际应用,掌握 JWT 的使用。这种认证机制不仅提高了安全性,还增强了 API 的灵活性和可扩展性。希望您在项目中能够顺利实现 JWT Bearer 认证,提升应用的安全性与用户体验。
 
jwt解析:https://jwt.io/



来源:https://www.cnblogs.com/forges/p/18519716
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 深入解析:JWT Bearer 认证在 .NET Core 中的应用