健康养生 发表于 2023-4-15 17:14:36

.NET 实现 JWT 登录验证

.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、各种验证规则等功能。

来源:https://www.cnblogs.com/ke210/archive/2023/04/15/17320965.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .NET 实现 JWT 登录验证