首页 > 其他分享 >.NET中使用JWT

.NET中使用JWT

时间:2022-12-29 17:45:39浏览次数:33  
标签:Claim string 使用 JWT Add claims var new NET

在控制台中使用JWT

新建测试项目并安装包

dotnet new sln
dotnet new console
dotnet sln add .
dotnet add package System.IdentityModel.Tokens.Jwt

生成JWT的代码

/// <summary>
/// 创建新的Jwt
/// </summary>
public static string CreateNewJwt()
{
    var claims = new List<Claim>();
    //添加负载
    claims.Add(new Claim(ClaimTypes.NameIdentifier, "6"));
    claims.Add(new Claim(ClaimTypes.Name, "Panda"));
    claims.Add(new Claim(ClaimTypes.Role, "User"));
    claims.Add(new Claim(ClaimTypes.Role, "Manager"));
    claims.Add(new Claim(ClaimTypes.Role, "Admin"));
    claims.Add(new Claim("SomeCode", "Panda666com"));
    //密钥
    string key = "fasdfad&9045dafz222#fadpio@0232";
    //设置过期时间
    DateTime expires = DateTime.Now.AddDays(1);

    byte[] secBytes = Encoding.UTF8.GetBytes(key);
    var secKey = new SymmetricSecurityKey(secBytes);
    var credentials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256Signature);
    var tokenDescriptor = new JwtSecurityToken(claims: claims,
        expires: expires, signingCredentials: credentials);
    //生成jwt字符串
    string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
    return jwt;
}

解码JWT的代码

/// <summary>
/// 解码JWT
/// </summary>
/// <param name="jwtString"></param>
/// <returns></returns>
public static string DecodeJwt(string jwtString)
{
    string jwt = jwtString;
    string[] segments = jwt.Split('.');
    string head = JwtDecode(segments[0]);
    string payload = JwtDecode(segments[1]);
    Console.WriteLine("--------head--------");
    Console.WriteLine(head);
    Console.WriteLine("--------payload--------");
    Console.WriteLine(payload);
    string JwtDecode(string s)
    {
        s = s.Replace('-', '+').Replace('_', '/');
        switch (s.Length % 4)
        {
            case 2:
                s += "==";
                break;
            case 3:
                s += "=";
                break;
        }
        var bytes = Convert.FromBase64String(s);
        return Encoding.UTF8.GetString(bytes);
    }

    return "";
}

验证JWT并解码

使用JwtSecurityTokenHandler类

/// <summary>
/// 验证Jwt字符串
/// </summary>
/// <param name="jwtString"></param>
public static Dictionary<string,string> ValidJwt(string jwtString)
{
    string secKey = "fasdfad&9045dafz222#fadpio@0232";
    JwtSecurityTokenHandler tokenHandler = new();
    TokenValidationParameters valParam = new();
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secKey));
    valParam.IssuerSigningKey = securityKey;
    valParam.ValidateIssuer = false;
    valParam.ValidateAudience = false;

    //返回值
    Dictionary<string, string> result = new Dictionary<string, string>();

    try
    {
        //解析Jwt
        ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwtString,
            valParam, out SecurityToken secToken);

        foreach (var claim in claimsPrincipal.Claims)
        {
            result[claim.Type] = claim.Value;
        }
    }
    catch(Exception ex)
    {
                
    }
    finally
    {
               
    }

    return result;
}

完整源代码

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace Test
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //创建新的Jwt
            string jwtEncodeString = CreateNewJwt();
            Console.WriteLine(jwtEncodeString);

            //读取Jwt
            string jwtDecodeString = DecodeJwt(jwtEncodeString);
            Console.WriteLine(jwtDecodeString);

            //验证Jwt
            Dictionary<string,string> result = ValidJwt(jwtEncodeString);
            foreach (var item in result)
            {
                Console.WriteLine($"{item.Key}-{item.Value}");
            }

            Console.WriteLine("Success");
        }

        /// <summary>
        /// 创建新的Jwt
        /// </summary>
        public static string CreateNewJwt()
        {
            var claims = new List<Claim>();
            //添加负载
            claims.Add(new Claim(ClaimTypes.NameIdentifier, "6"));
            claims.Add(new Claim(ClaimTypes.Name, "Panda"));
            claims.Add(new Claim(ClaimTypes.Role, "User"));
            claims.Add(new Claim(ClaimTypes.Role, "Manager"));
            claims.Add(new Claim(ClaimTypes.Role, "Admin"));
            claims.Add(new Claim("SomeCode", "Panda666com"));
            //密钥
            string key = "fasdfad&9045dafz222#fadpio@0232";
            //设置过期时间
            DateTime expires = DateTime.Now.AddDays(1);

            byte[] secBytes = Encoding.UTF8.GetBytes(key);
            var secKey = new SymmetricSecurityKey(secBytes);
            var credentials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256Signature);
            var tokenDescriptor = new JwtSecurityToken(claims: claims,
                expires: expires, signingCredentials: credentials);
            //生成jwt字符串
            string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
            return jwt;
        }

        /// <summary>
        /// 解码JWT
        /// </summary>
        /// <param name="jwtString"></param>
        /// <returns></returns>
        public static string DecodeJwt(string jwtString)
        {
            string jwt = jwtString;
            string[] segments = jwt.Split('.');
            string head = JwtDecode(segments[0]);
            string payload = JwtDecode(segments[1]);
            Console.WriteLine("--------head--------");
            Console.WriteLine(head);
            Console.WriteLine("--------payload--------");
            Console.WriteLine(payload);
            string JwtDecode(string s)
            {
                s = s.Replace('-', '+').Replace('_', '/');
                switch (s.Length % 4)
                {
                    case 2:
                        s += "==";
                        break;
                    case 3:
                        s += "=";
                        break;
                }
                var bytes = Convert.FromBase64String(s);
                return Encoding.UTF8.GetString(bytes);
            }

            return "";
        }

        /// <summary>
        /// 验证Jwt字符串
        /// </summary>
        /// <param name="jwtString"></param>
        public static Dictionary<string,string> ValidJwt(string jwtString)
        {
            string secKey = "fasdfad&9045dafz222#fadpio@0232";
            JwtSecurityTokenHandler tokenHandler = new();
            TokenValidationParameters valParam = new();
            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secKey));
            valParam.IssuerSigningKey = securityKey;
            valParam.ValidateIssuer = false;
            valParam.ValidateAudience = false;

            //返回值
            Dictionary<string, string> result = new Dictionary<string, string>();

            try
            {
                //解析Jwt
                ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwtString,
                    valParam, out SecurityToken secToken);

                foreach (var claim in claimsPrincipal.Claims)
                {
                    result[claim.Type] = claim.Value;
                }
            }
            catch(Exception ex)
            {
                
            }
            finally
            {
               
            }

            return result;
        }
    }
}

ASP.NET Core中使用JWT

创建测试项目和安装包

dotnet new sln
dotnet new webapi
dotnet sln add .
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

注册服务

Services.Configure<JWTOptions>(builder.Configuration.GetSection("JWT"));
Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(x =>
{
   var jwtOpt = builder.Configuration.GetSection("JWT").Get<JWTOptions>();
   byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey);
   var secKey = new SymmetricSecurityKey(keyBytes);
   x.TokenValidationParameters = new()
   {
      ValidateIssuer=false, ValidateAudience=false, ValidateLifetime=true,
      ValidateIssuerSigningKey=true, IssuerSigningKey=secKey
   };
});

使用服务

在Program.cs的app.UseAuthorization之前添加:

app.UseAuthentication();

在控制器中使用(创建Token)

[HttpPost(Name = "CreateJwt")]
[AllowAnonymous]
public async Task<string> CreateJwt(string userName = "",string password = "")
{
   //如果验证用户名和密码出现错误
   if (false)
   {
      return "";
   }
      
   var claims = new List<Claim>();
   //添加负载
   //用户Id
   claims.Add(new Claim(ClaimTypes.NameIdentifier,"UserId"));
   //用户名
   claims.Add(new Claim(ClaimTypes.Name, "UserName"));
   //用户角色
   var roles = new List<string>() { "User", "Manager", "Admin" };
   foreach (string role in roles)
   {
      claims.Add(new Claim(ClaimTypes.Role, role));
   }
   //其他内容
   claims.Add(new Claim("SomeCode", "Panda666com"));

   //创建jwtToken
   string jwtToken = CreateNewJwt(claims, "fasdfad&9045dafz222#fadpio@0232");

   return jwtToken;
}

/// <summary>
/// 创建新的Jwt
/// </summary>
/// <param name="claims">负载</param>
/// <param name="key">密钥</param>
/// <returns></returns>
public string CreateNewJwt(List<Claim> claims, string key)
{
   //设置过期时间
   DateTime expires = DateTime.Now.AddDays(1);

   byte[] secBytes = Encoding.UTF8.GetBytes(key);
   var secKey = new SymmetricSecurityKey(secBytes);
   var credentials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256Signature);
   var tokenDescriptor = new JwtSecurityToken(claims: claims,
      expires: expires, signingCredentials: credentials);
   //生成jwt字符串
   string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
   return jwt;
}

在控制器中使用(验证Token)

注意:需要登录才能访问的控制器类上添加[Authorize]特性

[HttpPost(Name = "ValidJwt")]
public IActionResult ValidJwt(string jwtString)
{
   string secKey = "fasdfad&9045dafz222#fadpio@0232";
   JwtSecurityTokenHandler tokenHandler = new();
   TokenValidationParameters valParam = new();
   var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secKey));
   valParam.IssuerSigningKey = securityKey;
   valParam.ValidateIssuer = false;
   valParam.ValidateAudience = false;

   //返回值
   Dictionary<string, string> result = new Dictionary<string, string>();

   try
   {
      //解析Jwt
      ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwtString,
            valParam, out SecurityToken secToken);

      foreach (var claim in claimsPrincipal.Claims)
      {
            result[claim.Type] = claim.Value;
      }
   }
   catch (Exception ex)
   {

   }
   finally
   {

   }

   string temp = "";
   foreach (var item in result)
   {
      temp += $"{item.Key}-{item.Value}";
   }

   return Ok($"{temp}");
}

标签:Claim,string,使用,JWT,Add,claims,var,new,NET
From: https://www.cnblogs.com/cqpanda/p/17012151.html

相关文章

  • Kubernetes 网络模型基础指南
    Kubernetes是为运行分布式集群而建立的,分布式系统的本质使得网络成为Kubernetes的核心和必要组成部分,了解Kubernetes网络模型可以使你能够正确运行、监控和排查应用程......
  • linux使用iperf3测试带宽
    1、https://www.alibabacloud.com/help/zh/express-connect/latest/test-the-performance-of-an-express-connect-circuit使用yum安装iperf3 本地服务器:[root@loaclh......
  • HTTPS 钓鱼攻击:黑客如何使用 SSL 证书假装信任
    让我们回到1994年。无需翻出寻呼机或穿上法兰绒衬衫。这是第一个SSL协议诞生的一年。它由Netscape推出,以满足对称为Internet的新奇发明增加安全性的日益增长的需......
  • golang中使用原子操作监听配置更新
    配置及代码文件{"name":"sasuke","age":25,"gender":"male","score":99.5}develop.jsonpackagemainimport("crypto/md5""enco......
  • HTTPS 钓鱼攻击:黑客如何使用 SSL 证书假装信任
    让我们回到1994年。无需翻出寻呼机或穿上法兰绒衬衫。这是第一个SSL协议诞生的一年。它由Netscape推出,以满足对称为Internet的新奇发明增加安全性的日益增长的需......
  • 终极.NET混淆器丨.NET Reactor产品介绍
    无与伦比的.NET代码保护系统,可完全阻止任何人反编译您的代码。  产品优势01、混淆技术.NETReactor通过向.NET程序集添加不同的保护......
  • redis使用示例
    packagecom.atguigu.gulimall.product;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.TypeReference;importorg.junit.jupiter.api.Test;importorg.ju......
  • CH9434-MCU代码移植,芯片使用详细说明(附Linux开发资料链接)
    简介CH9434是一款SPI转四串口转接芯片,提供四组全双工的9线异步串口,用于单片机/嵌入式/安卓系统扩展异步串口。提供25路GPIO,以及支持RS485收发控制引脚TNOW。本篇基于STM32......
  • Redis数据结构存储系统:第二章:如何使用
    Redis与SpringBoot整合:第一步:在项目中引入redis.clientsjedis第二步:将连接池和配置类创建好RedisUtil:importredis.clients.jedis.Jedis;importredis.clients.j......
  • docker compose安装与使用
    简介之前使用docker时,写完一个项目之后需要定义一个dockerfile,再通过dockerbuild生成一个镜像,并通过dockerrun执行;都是通过手动操作,用于单个容器,非常麻烦,现在想要的效......