1. 什么是 JWT(JSON Web Token)?
JWT 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它是一种紧凑的、自包含的方式,用于在用户和服务器之间传递声明(claims)。声明是关于用户的信息片段,如用户 ID、角色等。
JWT 由三部分组成,分别是头部(header)、载荷(payload)和签名(signature),格式为header.payload.signature
。
- 头部(header):通常包含令牌的类型(如 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。例如,
{"alg": "HS256", "typ": "JWT"}
。 - 载荷(payload):包含声明,这些声明可以是标准的(如 iss - 发行者、sub - 主题、aud - 受众等),也可以是自定义的用户相关信息,如用户 ID、用户名等。例如,
{"sub": "1234567890", "name": "John Doe", "admin": true}
。 - 签名(signature):是根据头部和载荷以及一个密钥(secret)来生成的,用于验证消息在传递过程中没有被篡改。
2. 什么是 JWT Bearer 认证?
JWT Bearer 认证是一种基于令牌的认证方式。当客户端向服务器发送请求时,它在请求头(通常是Authorization
头)中包含 JWT 令牌。服务器收到请求后,会验证令牌的有效性,包括签名是否正确、令牌是否过期等。如果令牌有效,服务器就可以根据令牌中的声明来授权用户访问相应的资源。
3. 在.NET Core 中应用 JWT Bearer 认证
(1)安装必要的 NuGet 包
Microsoft.AspNetCore.Authentication.JwtBearer
:这是用于在.NET Core 应用程序中实现 JWT Bearer 认证的核心包。
可以通过在 Visual Studio 的 NuGet 包管理器控制台中运行以下命令来安装:
Install - Package Microsoft.AspNetCore.Authentication.JwtBearer
(2)配置 JWT Bearer 认证服务
- 在
Startup.cs
文件的ConfigureServices
方法中,添加以下代码来配置 JWT Bearer 认证:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; //... public void ConfigureServices(IServiceCollection services) { // 其他服务配置... // 配置JWT Bearer认证 var key = "your_secret_key"; // 这里应该是一个安全的密钥,用于签名令牌,实际应用中不要使用明文 var issuer = "your_issuer"; var audience = "your_audience"; services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = issuer, ValidAudience = audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)) }; }); }
- 上述代码中:
ValidateIssuer
、ValidateAudience
、ValidateLifetime
和ValidateIssuerSigningKey
用于指定令牌验证的规则。例如,ValidateIssuer
设置为true
表示要验证令牌的发行者。ValidIssuer
和ValidAudience
指定了有效的发行者和受众的值。IssuerSigningKey
是用于验证令牌签名的密钥,这里使用了对称密钥(SymmetricSecurityKey
),也可以使用非对称密钥(如 RSA 密钥)。
(3)在请求管道中启用认证
- 在
Startup.cs
文件的Configure
方法中,添加以下代码来启用认证中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 其他中间件配置... app.UseAuthentication(); app.UseAuthorization(); // 其他中间件配置... }
UseAuthentication
用于设置认证中间件,它会处理请求头中的认证信息。UseAuthorization
用于设置授权中间件,它会根据认证结果和授权策略来决定用户是否有权访问资源。
(4)生成 JWT 令牌
- 通常,在用户登录成功后,服务器需要生成 JWT 令牌并返回给客户端。以下是一个简单的示例,用于生成 JWT 令牌:
using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; //... public string GenerateJwtToken(string userId, string userName) { var key = "your_secret_key"; var issuer = "your_issuer"; var audience = "your_audience"; var claims = new[] { new Claim(ClaimTypes.NameIdentifier, userId), new Claim(ClaimTypes.Name, userName) }; var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HS256); var token = new JwtSecurityToken( issuer: issuer, audience: audience, claims: claims, expires: DateTime.Now.AddHours(1), signingCredentials: credentials); return new JwtSecurityTokenHandler().WriteToken(token); }
- 在上述示例中:
- 首先定义了令牌的密钥、发行者和受众。
- 创建了一些声明(
claims
),这里包含了用户 ID 和用户名。 - 创建了签名凭证(
SigningCredentials
),使用之前定义的密钥和签名算法(HS256
)。 - 构建了
JwtSecurityToken
对象,设置了发行者、受众、声明、过期时间和签名凭证。 - 最后使用
JwtSecurityTokenHandler
将令牌对象转换为字符串并返回。
(5)在控制器或服务中使用认证后的信息
- 在控制器方法上,可以使用
[Authorize]
属性来要求用户进行认证才能访问该方法。例如:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; [Authorize] [Route("api/[controller]")] public class MyController : ControllerBase { [HttpGet] public IActionResult Get() { var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; var userName = User.FindFirst(ClaimTypes.Name)?.Value; // 根据用户ID和用户名进行相应的操作... return Ok(new { UserId = userId, UserName = userName }); } }
- 在上述控制器方法中,通过
User
属性可以访问经过认证后的用户信息(声明)。可以使用FindFirst
方法来获取特定的声明值,如用户 ID 和用户名。
通过以上步骤,就可以在.NET Core 应用程序中实现 JWT Bearer 认证,从而安全有效地验证用户身份并授权用户访问相应的资源。