首页 > 其他分享 >.NET 实现 JWT 登录验证

.NET 实现 JWT 登录验证

时间:2023-04-15 13:45:54浏览次数:58  
标签:登录 验证 JWT token Token var new NET

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

标签:登录,验证,JWT,token,Token,var,new,NET
From: https://www.cnblogs.com/ke210/p/17320965.html

相关文章

  • 读论文P2Net
    Abstract本文处理了室内环境中的无监督深度估计任务。这项任务非常具有挑战性,因为在这些场景中存在大量的非纹理区域。这些区域可以淹没在常用的处理户外环境的无监督深度估计框架的优化过程中。然而,即使这些区域被掩盖了,性能仍然不能令人满意。在本文中,我们认为非区分点匹配的性能......
  • 宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录
    问题描述:宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录问题排查:1.检查服务器3306端口是否开启,如果为云服务器,需要登录云服务器后台安全组设置开启;2.宝塔服务器页面设置对应的权限,安全起见一般设置指定IP访问。(很多Navicat无法访问就是因为权限未设置)  ......
  • kubernetes-nfs共享存储
    搭建nfs服务端#修改权限chmod-R777/nfs/data#编辑export文件vim/etc/exports/nfs/data*(rw,no_root_squash,sync)(“*“代表所有人都能连接,建议换成具体ip或ip段,如192.168.20.0/24)#配置生效exportfs-r#查看生效exportfs#启动rpcbind、nfs服务systemctlresta......
  • kubernets 集群证书过期解决方式
    查看证书过期时间kubeadmcertscheck-expiration解决方案手动更新证书#更新证书kubeadmcertsrenewall#重启相关服务dockerrestart$(dockerps|grep-E'kube-apiserver|kube-controller-manager|kube-scheduler|etcd'|awk'{print$1}')原文链接https://www.c......
  • Netty面试专题
    1.BIO、NIO和AIO的区别?BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有......
  • AirNet使用笔记5
    1、DBM“升级工具”,“InstallPosition”之后“UpdatePosition”失败;“ShowLog”提示:/home/cdatc/InstallTK/copyAirNet:errorwhileloadingsharedlibraries:libQtXml.so.4:cannotopensharedobjectfile:Nosuchfileordirectory原因:/usr/lib64下缺少以下3个libQt*......
  • JAVAWEB-项目-实现登录功能步骤-2023-04-14
    第一步:编写前端页面第二步:设置首页第三步:编写dao层用户dao接口第四步:编写Servic层用户Service接口实现类第五步:编写Servic层用户Service接口第六步:编写Servic层用户Service接口实现类(用@Test测试一下是否可行)第七步:编写LoginServlet类第八步:web.xml注册LoginServlet第九......
  • Net6+NLog 写入数据库 Sql Server为例
    这个百度一大片,到处不行,国外网站找也是有问题,官网文档也是有点操蛋。搞到现在ok了直接上代码。//Program.cs配置#region日志LogManager.LoadConfiguration(ParameterConfig.Nlog).GetCurrentClassLogger();builder.Logging.AddNLog(ParameterConfig.Nl......
  • gin框架中jwt实战之用户登录返回token
    流程:1、main.go中定义路由login调用user.Login方法2、user.login方法验证用户名,和密码,并生成token返回3、main.go中定义getUserInfo路由,调用user.GetUserInfo的方法4、getUserinfo中调用中间件对用户传过来的token进行验证5、验证通过后返回用户信息文件:main.go路由定......
  • gin框架中JWT的使用
    前言:Token和SessionSession是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而Token是令牌,访问资源接口(API)时所需要的资源凭证。Token使服务端无状态化,不会存储会话信息。正文:Gin JWT基于JWT的Token认证机制实现JSONWebToken(JWT)是一个......