- A+
.NET 实现 JWT 登录验证
在现代 Web 应用程序中,身份验证和授权是必不可少的功能。JSON Web Token (JWT) 是一种广泛使用的身份验证和授权机制,它可以用于安全地传输用户信息和授权数据。在本篇博文中,我们将学习如何在 C# .NET 中实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、以及各种验证规则。
准备工作
在开始之前,我们需要在项目中安装以下 NuGet 包:
- Microsoft.AspNetCore.Authentication.JwtBearer:用于处理 JWT 认证
- Microsoft.IdentityModel.Tokens:用于处理 JWT Token
可以通过 Visual Studio NuGet 包管理器或者通过命令行使用 dotnet add package 命令来安装这两个包。
创建 JwtAuthenticationManager 类
首先,我们需要创建一个 JwtAuthenticationManager 类,负责生成和验证 JWT Token。该类包含以下功能:
- 生成 JWT Token,包括用户信息的加密和过期时间的设置
- 验证 JWT Token,包括对 Token 的签名、过期时间等进行验证
- 刷新 Token,当 Token 过期时可以生成新的 Token
- 其他验证规则,例如验证 Token 的颁发者、受众等。
下面是 JwtAuthenticationManager 类的代码:
using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; public class JwtAuthenticationManager { private readonly string _secretKey; private readonly string _issuer; private readonly string _audience; private readonly double _tokenLifetimeMinutes; public JwtAuthenticationManager(string secretKey, string issuer, string audience, double tokenLifetimeMinutes = 30) { _secretKey = secretKey; _issuer = issuer; _audience = audience; _tokenLifetimeMinutes = tokenLifetimeMinutes; } // 生成 JWT Token public string GenerateToken(Dictionary<string, string> userInfo) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(_secretKey); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new ClaimsIdentity(userInfo.Select(kvp => new Claim(kvp.Key, kvp.Value)))), Expires = DateTime.UtcNow.AddMinutes(_tokenLifetimeMinutes), Issuer = _issuer, Audience = _audience, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } // 验证 JWT Token public ClaimsPrincipal ValidateToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(_secretKey); var validationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateIssuerSigningKey = true, ValidIssuer = _issuer, ValidAudience = _audience, IssuerSigningKey = new SymmetricSecurityKey(key) }; try { var claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out var validatedToken); return claimsPrincipal; } catch (Exception ex) { // 验证失败,返回 null return null; } } // 刷新 Token public string RefreshToken(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(_secretKey); var validatedToken = tokenHandler.ReadToken(token) as JwtSecurityToken; var userInfo = new Dictionary<string, string>(); foreach (var claim in validatedToken.Claims) { userInfo.Add(claim.Type, claim.Value); } // 重新生成 Token,并返回 return GenerateToken(userInfo); } // 其他验证规则,例如验证 Token 的颁发者、受众等 public bool ValidateOtherRules(string token) { var tokenHandler = new JwtSecurityTokenHandler(); var validatedToken = tokenHandler.ReadToken(token) as JwtSecurityToken; // 在这里添加其他验证规则的逻辑 // 示例:验证 Token 的颁发者是否是指定的颁发者 if (validatedToken.Issuer != _issuer) { return false; } // 示例:验证 Token 的受众是否是指定的受众 if (validatedToken.Audiences.All(a => a != _audience)) { return false; } // 其他验证规则... return true; } }
在 ASP.NET Core 中使用 JwtAuthenticationManager
在 ASP.NET Core 中使用 JwtAuthenticationManager 进行 JWT 登录验证的步骤如下:
-
在 Startup.cs 文件的 ConfigureServices 方法中添加 JWT 认证服务的配置:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateIssuerSigningKey = true, ValidIssuer = "your_issuer", ValidAudience = "your_audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("your_secret_key")) }; });
-
在 Startup.cs 文件的 Configure 方法中添加 JWT 认证中间件的配置:
app.UseAuthentication(); app.UseAuthorization();
-
在登录验证的逻辑中使用 JwtAuthenticationManager 类来生成和验证 JWT Token,示例如下:
// 生成 Token var jwtManager = new JwtAuthenticationManager("your_secret_key", "your_issuer", "your_audience"); var userInfo = new Dictionary<string, string> { { "userId", "1" }, { "userName", "exampleuser" }, // 添加其他用户信息... }; var token = jwtManager.GenerateToken(userInfo); // 验证 Token var claimsPrincipal = jwtManager.ValidateToken(token); if (claimsPrincipal == null) { // Token 验证失败 // 处理验证失败的逻辑... } else { // Token 验证成功 // 处理验证成功的逻辑... } // 刷新 Token var refreshedToken = jwtManager.RefreshToken(token);
-
在需要验证用户身份的地方,可以通过 HttpContext.User.Claims 来获取用户的声明信息,示例如下:
var userId = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "userId")?.Value; var userName = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "userName")?.Value; // 处理获取到的用户声明信息...
-
在需要验证 Token 是否合法的地方,可以调用 JwtAuthenticationManager 类的 ValidateOtherRules 方法进行其他验证规则的验证,示例如下:
var isTokenValid = jwtManager.ValidateOtherRules(token); if (isTokenValid) { // Token 合法 // 处理合法 Token 的逻辑... } else { // Token 非法 // 处理非法 Token 的逻辑... }
这样,就可以在 ASP.NET Core 中使用 JwtAuthenticationManager 类实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、各种验证规则等功能。可以根据具体的业务需求,进一步定制化和扩展 JwtAuthenticationManager 类的功能,以满足项目的要求。
参考链接
- ASP.NET Core 官方文档
- JWT 官方文档
- ASP.NET Core 中使用 JWT 进行身份验证和授权
- ASP.NET Core 3.0 JWT 授权认证
- ASP.NET Core 中使用 JWT 进行身份验证和授权
总结
本篇博文通过一个简单的案例,介绍了如何使用 C# .NET 实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、各种验证规则等功能。