翼度科技»论坛 编程开发 .net 查看内容

.NET 实现 JWT 登录验证

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
.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 类的代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IdentityModel.Tokens.Jwt;
  4. using System.Security.Claims;
  5. using System.Text;
  6. using Microsoft.IdentityModel.Tokens;
  7. public class JwtAuthenticationManager
  8. {
  9.         private readonly string _secretKey;
  10.         private readonly string _issuer;
  11.         private readonly string _audience;
  12.         private readonly double _tokenLifetimeMinutes;
  13.         public JwtAuthenticationManager(string secretKey, string issuer, string audience, double tokenLifetimeMinutes = 30)
  14.         {
  15.             _secretKey = secretKey;
  16.             _issuer = issuer;
  17.             _audience = audience;
  18.             _tokenLifetimeMinutes = tokenLifetimeMinutes;
  19.         }
  20.         // 生成 JWT Token
  21.         public string GenerateToken(Dictionary<string, string> userInfo)
  22.         {
  23.             var tokenHandler = new JwtSecurityTokenHandler();
  24.             var key = Encoding.ASCII.GetBytes(_secretKey);
  25.             var tokenDescriptor = new SecurityTokenDescriptor
  26.             {
  27.                 Subject = new ClaimsIdentity(new ClaimsIdentity(userInfo.Select(kvp => new Claim(kvp.Key, kvp.Value)))),
  28.                 Expires = DateTime.UtcNow.AddMinutes(_tokenLifetimeMinutes),
  29.                 Issuer = _issuer,
  30.                 Audience = _audience,
  31.                 SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
  32.             };
  33.             var token = tokenHandler.CreateToken(tokenDescriptor);
  34.             return tokenHandler.WriteToken(token);
  35.         }
  36.         // 验证 JWT Token
  37.         public ClaimsPrincipal ValidateToken(string token)
  38.         {
  39.             var tokenHandler = new JwtSecurityTokenHandler();
  40.             var key = Encoding.ASCII.GetBytes(_secretKey);
  41.             var validationParameters = new TokenValidationParameters
  42.             {
  43.                 ValidateIssuer = true,
  44.                 ValidateAudience = true,
  45.                 ValidateIssuerSigningKey = true,
  46.                 ValidIssuer = _issuer,
  47.                 ValidAudience = _audience,
  48.                 IssuerSigningKey = new SymmetricSecurityKey(key)
  49.             };
  50.             try
  51.             {
  52.                 var claimsPrincipal = tokenHandler.ValidateToken(token, validationParameters, out var validatedToken);
  53.                 return claimsPrincipal;
  54.             }
  55.            catch (Exception ex)
  56.            {
  57.                 // 验证失败,返回 null
  58.                 return null;
  59.            }
  60.         }
  61.         // 刷新 Token
  62.         public string RefreshToken(string token)
  63.         {
  64.             var tokenHandler = new JwtSecurityTokenHandler();
  65.             var key = Encoding.ASCII.GetBytes(_secretKey);
  66.             var validatedToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
  67.             var userInfo = new Dictionary<string, string>();
  68.             foreach (var claim in validatedToken.Claims)
  69.             {
  70.                 userInfo.Add(claim.Type, claim.Value);
  71.             }
  72.             // 重新生成 Token,并返回
  73.             return GenerateToken(userInfo);
  74.         }
  75.         // 其他验证规则,例如验证 Token 的颁发者、受众等
  76.         public bool ValidateOtherRules(string token)
  77.         {
  78.             var tokenHandler = new JwtSecurityTokenHandler();
  79.             var validatedToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
  80.             // 在这里添加其他验证规则的逻辑
  81.             // 示例:验证 Token 的颁发者是否是指定的颁发者
  82.             if (validatedToken.Issuer != _issuer)
  83.             {
  84.                 return false;
  85.             }
  86.             // 示例:验证 Token 的受众是否是指定的受众
  87.             if (validatedToken.Audiences.All(a => a != _audience))
  88.             {
  89.                 return false;
  90.             }
  91.             // 其他验证规则...
  92.             return true;
  93.         }
  94. }
复制代码
在 ASP.NET Core 中使用 JwtAuthenticationManager

在 ASP.NET Core 中使用 JwtAuthenticationManager 进行 JWT 登录验证的步骤如下:

  • 在 Startup.cs 文件的 ConfigureServices 方法中添加 JWT 认证服务的配置:
    1. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    2.     .AddJwtBearer(options =>
    3.     {
    4.         options.TokenValidationParameters = new TokenValidationParameters
    5.         {
    6.             ValidateIssuer = true,
    7.             ValidateAudience = true,
    8.             ValidateIssuerSigningKey = true,
    9.             ValidIssuer = "your_issuer",
    10.             ValidAudience = "your_audience",
    11.             IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("your_secret_key"))
    12.         };
    13.     });
    复制代码
  • 在 Startup.cs 文件的 Configure 方法中添加 JWT 认证中间件的配置:
    1. app.UseAuthentication();
    2. app.UseAuthorization();
    复制代码
  • 在登录验证的逻辑中使用 JwtAuthenticationManager 类来生成和验证 JWT Token,示例如下:
    1. // 生成 Token
    2. var jwtManager = new JwtAuthenticationManager("your_secret_key", "your_issuer", "your_audience");
    3. var userInfo = new Dictionary<string, string>
    4. {
    5.     { "userId", "1" },
    6.     { "userName", "exampleuser" },
    7.     // 添加其他用户信息...
    8. };
    9. var token = jwtManager.GenerateToken(userInfo);
    10. // 验证 Token
    11. var claimsPrincipal = jwtManager.ValidateToken(token);
    12. if (claimsPrincipal == null)
    13. {
    14.     // Token 验证失败
    15.     // 处理验证失败的逻辑...
    16. }
    17. else
    18. {
    19.     // Token 验证成功
    20.     // 处理验证成功的逻辑...
    21. }
    22. // 刷新 Token
    23. var refreshedToken = jwtManager.RefreshToken(token);
    复制代码
  • 在需要验证用户身份的地方,可以通过 HttpContext.User.Claims 来获取用户的声明信息,示例如下:
    1. var userId = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "userId")?.Value;
    2. var userName = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "userName")?.Value;
    3. // 处理获取到的用户声明信息...
    复制代码
  • 在需要验证 Token 是否合法的地方,可以调用 JwtAuthenticationManager 类的 ValidateOtherRules 方法进行其他验证规则的验证,示例如下:
    1. var isTokenValid = jwtManager.ValidateOtherRules(token);
    2. if (isTokenValid)
    3. {
    4.     // Token 合法
    5.     // 处理合法 Token 的逻辑...
    6. }
    7. else
    8. {
    9.     // Token 非法
    10.     // 处理非法 Token 的逻辑...
    11. }
    复制代码
这样,就可以在 ASP.NET Core 中使用 JwtAuthenticationManager 类实现 JWT 登录验证,并处理用户信息的加密、刷新 Token、各种验证规则等功能。可以根据具体的业务需求,进一步定制化和扩展 JwtAuthenticationManager 类的功能,以满足项目的要求。
参考链接

总结

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

来源:https://www.cnblogs.com/ke210/archive/2023/04/15/17320965.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具