.NET 实现 JWT 登录验证

  • .NET 实现 JWT 登录验证已关闭评论
  • 238 次浏览
  • A+
所属分类:.NET技术
摘要

在现代 Web 应用程序中,身份验证和授权是必不可少的功能。JSON Web Token (JWT) 是一种广泛使用的身份验证和授权机制,它可以用于安全地传输用户信息和授权数据。在本篇博文中,我们将学习如何在 C# .NET 中实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、以及各种验证规则。


.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 登录验证的步骤如下:

  1. 在 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"))         };     }); 
  2. 在 Startup.cs 文件的 Configure 方法中添加 JWT 认证中间件的配置:

    app.UseAuthentication(); app.UseAuthorization(); 
  3. 在登录验证的逻辑中使用 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);  
  4. 在需要验证用户身份的地方,可以通过 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; // 处理获取到的用户声明信息... 
  5. 在需要验证 Token 是否合法的地方,可以调用 JwtAuthenticationManager 类的 ValidateOtherRules 方法进行其他验证规则的验证,示例如下:

    var isTokenValid = jwtManager.ValidateOtherRules(token); if (isTokenValid) {     // Token 合法     // 处理合法 Token 的逻辑... } else {     // Token 非法     // 处理非法 Token 的逻辑... } 

这样,就可以在 ASP.NET Core 中使用 JwtAuthenticationManager 类实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、各种验证规则等功能。可以根据具体的业务需求,进一步定制化和扩展 JwtAuthenticationManager 类的功能,以满足项目的要求。

参考链接

  1. ASP.NET Core 官方文档
  2. JWT 官方文档
  3. ASP.NET Core 中使用 JWT 进行身份验证和授权
  4. ASP.NET Core 3.0 JWT 授权认证
  5. ASP.NET Core 中使用 JWT 进行身份验证和授权

总结

本篇博文通过一个简单的案例,介绍了如何使用 C# .NET 实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、各种验证规则等功能。