.Net Core 中间件验签

文章目录

    • 为什么是用中间件而不是筛选器?
    • 代码实现
    • 技术要点
      • context.Request.EnableBuffering()
      • 指针问题
    • 小结

为什么是用中间件而不是筛选器?

在这里插入图片描述

为什么要用中间件验签,而不是筛选器去验签?
1、根据上图我们可以看到,中间件在筛选器之前,而筛选往下就是我们写业务逻辑代码的控制器了。这就大大增加了我们被攻击的风险。
2、用筛选器我们需要在每个控制器上都添加相应的标识,如果需要校验的sign的控制器多的话,就增加了很多不必要的工作量,和风险,如果某个控制器一时疏忽忘记加筛选器的话就有可能会被攻击。

筛选器一般都是当数据得到信任的时候做验证,例如用户登录了,做功能的权限判定,中间件判定非信任数据

代码实现

 /// <summary>/// 验签中间件/// </summary>public class SignatureMiddleware{ /// <summary>/// 用户服务/// </summary>public UserService _userService { get; set; }private readonly RequestDelegate _next;/// <summary>/// 构造函数/// </summary>/// <param name="next">上下文</param>/// <param name="userService">用户服务注入</param>public SignatureMiddleware(RequestDelegate next, UserService userService){_next = next;_userService = userService;}/// <summary>/// 管道委托/// </summary>/// <param name="context">请求</param>/// <returns></returns>public async Task Invoke(HttpContext context){if (context.Request.Path.Value.StartsWith("/api/Order")){// 验证签名var isValidSignature = await ValidateSignatureAsync(context);if (isValidSignature.Item1){await _next(context);}else{context.Response.StatusCode = 403;await context.Response.WriteAsJsonAsync(AlwaysResult.Error(isValidSignature.Item2));}}else{await _next(context);}}private async Task<(bool, string)> ValidateSignatureAsync(HttpContext context){context.Request.EnableBuffering();//倒带string Postbody = string.Empty;string sign = context.Request.Headers[GlobalContext.SystemConfig.OpenApiSettings.SignName].ParseToString();string timestamp = context.Request.Headers[GlobalContext.SystemConfig.OpenApiSettings.Timestamp].ParseToString();string appkey = context.Request.Headers[GlobalContext.SystemConfig.OpenApiSettings.Appkey].ParseToString();//先根据Appkey查询这个账户的状态:UserExtend user = await _userService.GetForm(appkey);if (user != null){context.Request.Body.Position = 0;var readResult = await context.Request.BodyReader.ReadAsync();context.Request.BodyReader.AdvanceTo(readResult.Buffer.Start, readResult.Buffer.End);Postbody = Encoding.UTF8.GetString(readResult.Buffer.FirstSpan);string checksign = DESEncrypt.MD5(appkey + timestamp + Postbody + user.F_Account + appkey).ToLower();if (!checksign.Equals(sign)){return (false, "验签失败!");}else{context.Request.Body.Position = 0;//指针回拨return (true, "");}}else{return (false, "非法签名!");}}}

技术要点

context.Request.EnableBuffering()

ValidateSignatureAsync 方法为验证签名方法,方法内第一行中的:context.Request.EnableBuffering();的作用是允许http请求中的body重复读取,如果不加这个方法当数据在验签过程中读取出来之后到了控制器时,控制器中获取到的body就会是空值

指针问题

context.Request.Body.Position ;
代码中用到了两次,第一次使用的时候是将指针指向body的第一位。当读取出数据之后,指针会由第一位移动到最后一位,因此我们在读取完验签完成之后需要把指针从最后以为拨回到第一位。如果没有验签通过也就没有那个必要了。

小结

在学习过程中我们不仅要知其然还要知其所以然。
中间件:用于过滤非信任数据
过滤器:用于判定受信任的安全的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL--彻底解决Navicat备份时的报错

原文网址&#xff1a;MySQL--彻底解决Navicat备份时的报错_IT利刃出鞘的博客-CSDN博客 简介 本文介绍彻底解决Navicat备份时的报错。 正确的方法 见&#xff1a;MySQL命令--使用mysqldump导出导入数据库_IT利刃出鞘的博客-CSDN博客 错误的方法 方法1.转储SQL文件 这种方…

2.2 塑性力学——主应力、主方向、不变量

个人专栏—塑性力学 1.1 塑性力学基本概念 塑性力学基本概念 1.2 弹塑性材料的三杆桁架分析 弹塑性材料的三杆桁架分析 1.3 加载路径对桁架的影响 加载路径对桁架的影响 2.1 塑性力学——应力分析基本概念 应力分析基本概念 2.2 塑性力学——主应力、主方向、不变量 主应力、主…

【嵌入式——QT】标准对话框

【嵌入式——QT】标准对话框 文件对话框颜色对话框字体对话框输入对话框消息框代码示例 文件对话框 QFileDialog 常用静态函数 getOpenFileName&#xff1a;选择打开一个文件&#xff1b;getOpenFileNames&#xff1a;选择打开多个文件&#xff1b;getSaveFileName&#xff1…

【算法面试题】-07

小明找位置 题目描述 小朋友出操&#xff0c;按学号从小到大排成一列;小明来迟了&#xff0c;请你给小明出个主意&#xff0c;让他尽快找到他应该排的位置。 算法复杂度要求不高于nLog(n);学号为整数类型&#xff0c;队列规模<10000; 输入描述 1、第一行:输入已排成队列的…

Vue中怎么使用router进行页面传参

在响应式编程中&#xff0c;使用 Vue Router 传递参数通常涉及到以下几个方面&#xff1a; 1. 动态路由匹配 动态路由匹配允许你根据 URL 中的参数来渲染不同的组件。这在显示用户信息、博客文章等需要根据 ID 或其他标识符来区分内容的情况下非常有用。 例如&#xff0c;如果…

浅淡 C++ 与 C++ 入门

我们知道&#xff0c;C语言是结构化和模块化的语言&#xff0c;适用于较小规模的程序。而当解决复杂问题&#xff0c;需要高度抽象和建模时&#xff0c;C语言则不合适&#xff0c;而C正是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的吸烟检测系统(深度学习+Python代码+PySide6界面+训练数据集)

摘要&#xff1a;本文详细说明了如何利用深度学习开发一个用于监测吸烟行为的系统&#xff0c;并分享了完整的代码实现。该系统采用了先进的YOLOv8算法&#xff0c;同时还使用YOLOv7、YOLOv6、YOLOv5算法&#xff0c;并对它们进行了性能比较&#xff0c;呈现了不同模型的性能指…

记一次特殊的渗透经历

起因 搞安全的小伙伴们应该知道&#xff0c;干我们这行老是会碰到一些奇奇怪怪的问题和需求&#xff0c;比如上次&#xff0c;某客户领导说让我给他找个会渗透的小伙子来&#xff0c;有个比较棘手的业务。我一听&#xff0c;心想&#xff1a;好嘛&#xff0c;这私活不就来了嘛…

MySQL 开发规范

优质博文&#xff1a;IT-BLOG-CN 一、设计原则 原则&#xff1a; SQL开发规范制定是基于良好的编码习惯和可读性&#xff1b; 目的&#xff1a; 消除冗余&#xff0c;数据简约&#xff0c;提高效率&#xff0c;提高安全&#xff1b; 【1】禁止在线上生产环境做数据库压力测试&…

Linux环境下的数据库SQL学习

1.在Ubuntu下安装sqlite3软件 输入sqlite3启动&#xff0c;输入.quit退去 2.SQL语言与命令&#xff1a; sqlite3文件名----寻找文件地址 .header on/off 打开/关闭 数据库中列的名称 .mode csv/column/html/insert/line/list/tabs/tcl 数据库程序&#xff1a;名字.sql …

视频监控管理系统EasyCVR平台设备增删改操作不生效是什么原因?

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…

使用Python检测贝叶斯网络的因果关系检测

在机器学任务中&#xff0c;确定变量间的因果关系&#xff08;causality&#xff09;可能是一个具有挑战性的步骤&#xff0c;但它对于建模工作非常重要。本文将总结有关贝叶斯概率&#xff08;Bayesian probabilistic&#xff09;因果模型&#xff08;causal models&#xff0…

数据结构——线性表顺序表示详解

目录 1.线性表的类型定义 2.基本操作 3.线性表的存储结构 4.补充 1.元素类型说明 2.数组定义​编辑 3.c语言的内存动态分配 4.c的动态存储分配 5.c中的参数传递 引用类型作参数 6.顺序表基本操作的实现 1.线性表的初始化 代码示例&#xff1a; 2.销毁线性表&…

什么是光伏气象站?—气象科普

光伏气象站&#xff0c;也称为光伏环境监测仪&#xff0c;是一种专门针对光伏发电站研发生产的环境监测系统。它主要利用太阳能电池板将太阳能转化为电能&#xff0c;并配备有气象监测设备以实时监测和记录气象数据。这些数据对于评估光伏电站的性能、效率和故障诊断至关重要&a…

SV-7045网络草坪音箱安装说明 景区园区背景音乐广播石头音箱

SV-7045网络草坪音箱安装说明 景区园区背景音乐广播石头音箱 在做室外公共广播/背景音乐系统时&#xff0c;对于草坪音箱的安装方法,大家可能不甚了解&#xff0c;所以将具体安装方法作简要说明。 音箱安装步骤如下&#xff1a; 1.测量草地音箱的底座尺寸大小&#xff0c;最…

网络协议UDP详解

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的、不可靠的、面向数据报的传输协议。它提供了一种简单的数据包交换服务&#xff0c;适用于一些对数据传输时延要求较低、但对数据可靠性要求不高的应用场景&#xff0c;如音频、视频…

C# 异步调用aysnc await

一、基本概念 在C#中&#xff0c;async和await关键字用于异步编程。异步编程允许程序在执行I/O密集型操作时不会被阻塞&#xff0c;从而提高程序的性能和响应性。 async关键字用于定义异步方法&#xff0c;表明该方法可能包含await表达式&#xff0c;并且可以在其执行期间异步…

ubuntu20.04 创建ros环境、创建rospackage

roswiki教程&#xff1a;https://wiki.ros.org/cn/ROS/Tutorials 环境准备 安装ros环境 这里选择noetic版本的ros&#xff0c;安装步骤参考&#xff1a;https://zhuanlan.zhihu.com/p/662284005 创建工作空间 这里我在用户目录下创建catkin的工作目录catkin_ws &#xff0…

Linux 多线程开发

第三章 Linux 多线程开发 3.1 线程3.1.2 线程操作3.1.2 线程属性 3.2 线程同步3.2.1 互斥量/锁3.2.2 死锁3.2.3 读写锁 3.3 生产者消费者模型3.3.1 条件变量3.3.2 信号量/灯 网络编程系列文章&#xff1a; 第1章 Linux系统编程入门&#xff08;上&#xff09; 第1章 Linux系统…

TSINGSEE青犀煤矿矿井视频监控与汇聚融合管理视频监管平台建设方案

一、背景需求 随着我国经济的飞速发展&#xff0c;煤炭作为我国的主要能源之一&#xff0c;其开采和利用的重要性不言而喻。然而&#xff0c;煤矿事故频发&#xff0c;不仅造成了巨大的人员伤亡和财产损失&#xff0c;也对社会产生了深远的负面影响。视频监控系统作为实现煤矿智…