学习ASP.NET Core的身份认证(基于JwtBearer的身份认证3)

news/2024/12/23 20:45:22 标签: JwtBear, JWT Token

  根据参考文献1中JWT Token的组成及计算方式,对照参考文献2中的界面,实现简单的JWT Token解析及验证程序,主要功能包括:
  1)拆分Token字符串,将前两段使用Base64UrlEncoder类解码并转为UTF8字符串(需添加Microsoft.IdentityModel.Tokens包);
  2)调用HmacSha256算法计算Token前两段的Hash值,并转成字符串与Token进行对比验证,注意这里将Hash值转换成字符串时一定要用Base64UrlEncoder,不要用Convert.ToBase64String函数,这两者转换出的字符串还是有些许差异。反编译JwtSecurityTokenHandler().WriteToken函数,最终看到Token最后一段内容是调用Base64UrlEncoder编码的。

在这里插入图片描述

  主要代码及程序运行效果如下所示:

string[] subString=txtToken.Text.Split('.');
 
txtHeader.Text=Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(subString[0]));
txtPayload.Text = Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(subString[1]));
txtSignature.Text=subString[2];

public static void ComputeHmacSha256(string message, string secret, string originHash)
{
    byte[] keyBytes = Encoding.UTF8.GetBytes(secret);
    byte[] messageBytes = Encoding.UTF8.GetBytes(message);

    using (HMACSHA256 hmac = new HMACSHA256(keyBytes))
    { 
        byte[] hash = hmac.ComputeHash(messageBytes);

        if(string.Equals(originHash, Base64UrlEncoder.Encode(hash)))
        {
            MessageBox.Show("验证成功");
        }
        else
        {
            MessageBox.Show("验证失败");
        } 
    }
} 

在这里插入图片描述

参考文献:
[1]https://jwt.io/introduction/
[2]https://jwt.io/#debugger-io
[3]https://blog.csdn.net/x1234w4321/article/details/140316485


http://www.niftyadmin.cn/n/5796980.html

相关文章

NestJS中使用DynamicModule实现模块动态加载

1. 介绍 在NestJS中,模块是组织代码的基本单元,它将相关的服务和控制器组织在一起。然而,在某些情况下,我们可能需要根据不同的条件动态加载模块,以满足不同的业务需求。这时,就可以使用DynamicModule了。…

豆包MarsCode:小U的数字插入问题

问题描述 问题分析 问题的核心是找到将数字 b 插入到数字 a 的某个位置后,使形成的数字尽可能大。需要仔细分析以下几个要点: 1. 分析数字的特性 输入的两个数字: a 是一个正整数(例如 76543)。b 是一个非负整数&am…

金融保险行业数字化创新实践:如何高效落地自主可控的企业级大数据平台

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量替代 OGG, Kettle 等同步工具,以及基于 Kafka 的 ETL 解决方案,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业…

CTF入门:以Hackademic-RTB1靶场为例初识夺旗

一、网络扫描 靶机ip地址为192.168.12.24 使用nmap工具进行端口扫描 nmap -sT 192.168.12.24 二、信息收集 1、80端口探索 靶机开放了80和22端口,使用浏览器访问靶机的80端口,界面如下: 点击target发现有跳转,并且url发生相应变…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC(Two-Phase Commit)协议准备阶段提交阶段情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务情况 2:当所有事务参与者均反馈就绪(ready&a…

常用类晨考day15

1.基本数据类型以及对应包装类 Byte Short Integer Long Float Double Boolean Character 2.什么是自动拆箱和装箱,jdk版本有什么要求?代码举 例并标明 Integer a 100; // 装箱 int b a; // 拆箱 从JDK1.5才开始支持 3.NumberFormatException是什么异常…

ES6学习函数(四)

这里写目录标题 一、带参数默认值的函数二、rest参数三、箭头函数一、箭头函数二、箭头函数的作用2.1、使表达更加简洁2.2、简化回调函数 三、箭头函数使用注意点3.1、没有this绑定3.2、箭头函数中没有arguments对象3.3、箭头函数不能使用new关键字来实例化对象 一、带参数默认…

c++---------数据类型

基本数据类型 整数类型(Integral Types) int(整型) 这是最常用的整数类型,通常用于存储一般范围的整数值。在32位系统中,int类型一般占用4个字节,取值范围大约是 - 2147483648到2147483647。例如…