ASP.NET Core使用Middleware有条件地允许访问路由

问题

有时,我们可能在Web API中包含一些具有调试功能的请求。比如我们上次的文章中“晕了!这个配置值从哪来的?”使用的获取配置值的功能:

endpoints.MapGet("/test2/{key:alpha}", async context =>
{var key = context.Request.RouteValues["key"].ToString();foreach (var provider in Configuration.Providers.Reverse()){if (provider.TryGet(key, out string value)){await context.Response.WriteAsync(provider.ToString());await context.Response.WriteAsync("\r\n");await context.Response.WriteAsync(value);break;}}
});

但你绝不会想在生产环境中暴露它们。要想实现此目的,有多种方案:

  • 用户权限验证

  • 编译成单独dll,不发布到生产环境

这些方案各有利弊,这里我们介绍一种使用Middleware实现的简单方案。

实现

从上图可以看到,请求要访问到实际路由,需要先经过Middleware,我们可以在最外层的Middleware进行检查,只有满足条件的请求才能通过,否则返回403错误。

Middleware代码如下:

public class DebugMiddleware : IMiddleware
{public async Task InvokeAsync(HttpContext context, RequestDelegate next){var isDebugEndpoint = context.Request.Path.Value.Contains("/test");var debugKey = context.Request.Query["debugKey"].ToString();var debugKeyInConfig = "123456";//来自于配置if (isDebugEndpoint && debugKey!=debugKeyInConfig){context.SetEndpoint(new Endpoint((context) =>{context.Response.StatusCode = StatusCodes.Status403Forbidden;return Task.CompletedTask;},EndpointMetadataCollection.Empty,"无权访问"));}await next(context);}
}

当请求地址包含“/test”时,检查请求参数debugKey是否和配置的值一样,如果不一样就返回403错误。

效果如下图:

结论

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

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

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

相关文章

java匹配两个字符_·代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?...

代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配? 如题,代表任意一个字符,*代表任意一串字符,判断两个字符串是否匹配?假如a字符串为:as*bncb,b字符串为asdfgvbbnchb,则…

如何用最低的成本教育出最棒的孩子?看完这些公众号你就知道了

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的,其实是我们对事物的见识与内心的格局,见识的深浅决定人生的深浅,格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号,希望能够给你带…

Virtualbox 无缝整合linux和windows双系统

一直以来,为了使用公司规定的内部通信工具RTX, 而不得不在ubuntu上安装一个virtualbox以运行RTX, 但是由于是运行在虚拟机里面,所以经常不能及时的回复同时的消息,而造成沟通的延迟。 所以就想着,能不能及时的在ubuntu上面看到…

archlinux yaourt安装 以及出错细节 database file for archlinuxfr does not exist.

archlinux yaourt安装 但一直报错如下: :: Synchronizing package databases... core is up to date   extra is up to date   community is up to date  error: failed retrieving file archlinuxfr.db from repo.archlinuxcn.org : The requested URL …

WCF分布式开发常见错误(10):套接字连接中断,The socket connection was aborted

(使用Windows Service作为宿主的时候也会出现这样的情况,搜索的) 我们这里是自定义托管宿主,在进行WCF编程开发过程时,使用NetTcpBinding绑定协议,作为通讯协议,可能会引发这样的异常&#xff0…

聊一聊对外API接口的存活检查可以怎么做

背景 公司内部的API接口一般会分为两大类,一类是直接暴露在公网可以访问的,一类是只能在局域网内访问的。暴露在公网的一般就是业务网关以及一些和第三方公司有着某些合作,从而进行数据交互的接口。检查API接口是否存活,第一反应应…

mysql slave 1032_修复mysql slave复制1032错误

一台从库出现1032错误,那1032是什么错误,我们看一下[rootBLAVDP021 ~]# perror 1032MySQL error code 1032 (ER_KEY_NOT_FOUND): Cant find record in %-.192s简单说,就是在从库上找不到相应的记录,同时在show slave status\G;中有相关输出&a…

各种机械原理动态图,看完脑洞大开,绝对涨姿势!

全世界只有3.14 % 的人关注了爆炸吧知识1.钥匙开锁2.撬锁3.汽车换挡4.手枪上膛发射5.炮弹发射原理6.手雷爆炸7.洗衣机8.缝纫机9.心脏10. 近视眼手术:原理其实很简单,就是把角膜削成一个“隐形眼镜”。11.零钱分类12.吹号转载来源:物理好教师部…

HDOJ 1875 HDU 1875 畅通工程再续 ACM 1875 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋题目地址: http://acm.hdu.edu.cn/showproblem.php?pid1875题目描述:畅通工程再续Time Limit: 2000/1000MS (Java/Others) Memory Limit: 32768/32768K (Java/Others)Total Submission(s): 3822Accepted Subm…

CSharp设计模式读书笔记(10):装饰模式(学习难度:★★★☆☆,使用频率:★★★☆☆)...

装饰模式(Decorator Pattern): 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。 模式角色与结构: 示例代码: using System; using System.Collections.Generic; using Syste…

ShardingCore 如何呈现“完美”分表

这篇文章是我针对efcore的分表的简单介绍,如果您有以下需求那么可以自己选择是否使用本框架,本框架将一直持续更新下去,并且免费开源为.net生态做贡献,如果您觉得不错那么请帮忙点个star谢谢,框架地址[sharding-core](https://github.com/xuejmnet/shard…

使用javascript oop开发滑动(slide) 菜单控件

这里使用原生的javascript,用面向对象的方式创建一个容易维护使用方便的滑动菜单,调用方式如下:var$sliding document.getElementById("silding");vars1 newSliding();s1.commands $sliding.getElementsByTagName("dt");…

这段代码什么意思啊?

这段代码什么意思啊? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061217214802252.htmlprocedure TForm3.RadioButton3Click(Sender: TObject); begin ADOTable1.refresh; with ADOTable1 do try disablecontrols; filte…

他毕业于北师大,编写了我国首套数学教材,陈景润华罗庚都崇拜他

全世界只有3.14 % 的人关注了爆炸吧知识要说起我国著名的数学家,很多人会想到陈景润、华罗庚等人,这些大数学家为我国数学研究做出了卓越贡献,也深深影响了很多人。那么,像陈景润、华罗庚这些大数学家,他们学习数学有受…

用多媒体库 Bass.dll 播放 mp3 [8] - 实时显示左右声道的峰值

为什么80%的码农都做不了架构师?>>> 本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, ComCtrls;typeTForm1 class(TForm)OpenDialog1: TOpe…

最近看了两本低代码的书

月初写了一篇《你真的了解低代码平台吗?》,介绍了下我对低代码产品的一些认识,随后有朋友送了我两本华章出版的关于低代码的书:明道云的《零代码实战》和微软的《实战低代码》,目前市面上也就这两本关于低代码的书。因…

如何逼疯一名数学系学生?

全世界只有3.14 % 的人关注了爆炸吧知识今天在知乎竟看到这样一个问题但看在关注人数如此之多超模君就放下成见稍微透露一下我们的“底线”到底要怎样做才能激怒数学系学生数学沾边法顾名思义只要和数学沾边就可以开怼在菜市场算菜钱时在提问后的0.5秒迅速补上致命一刀经过彩票…

java 图片压缩 base64_图片改变像素,宽高,Base64编码处理

1.改变图片像素private void setAlpha(String os) {/*** 增加测试项* 读取图片,绘制成半透明,修改像素*/try {ImageIcon imageIcon new ImageIcon(os);BufferedImage bufferedImage new BufferedImage(imageIcon.getIconWidth(),imageIcon.getIconHeight(), Buffe…

WinAPI: 钩子回调函数之 MouseProc

为什么80%的码农都做不了架构师?>>> MouseProc(nCode: Integer; {}wParam: WPARAM; {}lParam: LPARAM {} ): LRESULT; {}//待续...转载于:https://my.oschina.net/hermer/blog/320962

shell对于字符串的操作

shell对于字符串的操作:以下为代码内容:得到长度 代码:%x"abcd" # 方法一 %expr length $x 4 # 方法二 %echo ${#x} 4 # 方法三 %expr "$x" : ".*" 4 # expr 的帮助 # STRING : REGEXP anchored pattern match of REGEXP in STRING…