在当代 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.Jwt
复制代码 2. 配置 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> [ApiController]<br> [Route("api/[controller]")]<br> public class AuthController : ControllerBase<br> {<br> private readonly IConfiguration _configuration;<br><br> public AuthController(IConfiguration configuration)<br> {<br> _configuration = configuration;<br> }<br><br> [HttpPost("login")]<br> public IActionResult Login([FromBody] 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 端点
可以通过 [Authorize] 特性掩护需要身份验证的 API 端点:- using Microsoft.AspNetCore.Authorization;<br>using Microsoft.AspNetCore.Mvc;<br><br>namespace MyApp.Controllers<br>{<br> [ApiController]<br> [Route("[controller]")]<br> public class WeatherForecastController : ControllerBase<br> {<br> [Authorize] // 保护此 API<br> [HttpGet]<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/
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |