问题

有时,我们可能在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“,记住我!

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

  1. 利用Asp.Net Core的MiddleWare思想处理复杂业务流程

    最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助. 背景 一个流程初始化接口,接口中根据传入的 ...

  2. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  3. 在ASP.NET Core使用Middleware模拟Custom Error Page功能

    一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...

  4. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由

    路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把它映射到一个Controller上面的Ac ...

  5. ASP.NET Core -中间件(Middleware)使用

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

  6. Asp.Net Core Authentication Middleware And Generate Token

    或者应该包含什么信息呢? 1.这个人是谁? 2.这个人可以用此token访问什么样的内容?(scope) 3.token的过期时间 (expire) 4.谁发行的token. 5.其他任何你希望加入的 ...

  7. linux无法访问root文件夹,asp.net core 2.1部署到Linux无法访问wwwroot文件夹中的资源...

    首先 publish,dotnet xxx.dll 要在 dll所在目录 着实不方便 我已经改成 配置的了 app.UseDefaultFiles ( new DefaultFilesOptions( ...

  8. ASP.NET Core使用功能开关控制路由访问

    前言 在前面的文章,我们介绍了使用Middleware有条件地允许访问路由(<ASP.NET Core使用Middleware有条件地允许访问路由>). 而对于一些试验性的功能,我们并不希 ...

  9. 为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...

    前言 ASP.NET Core的Middleware(中间件)就是使用了管道模式: Request(请求)在管道中传递,依次经过管道中的每一个MiddleWare进行处理. MiddleWare就像一 ...

最新文章

  1. java 值传递 和 引用传递
  2. oracle中treat函数,Oracle 函数概览
  3. python详细安装教程3.8-手把手教你安装Python3.8环境
  4. Linux 上网配置 修改IP
  5. 【附可运行代码】剑指 Offer 16. 数值的整数次方
  6. 孩子数学成绩不好怎么办_孩子数学成绩不好怎么办
  7. 山区建小学(信息学奥赛一本通-T1197)
  8. java 调用plc程序_从老师傅那里偷学来的PLC宝贵经验!
  9. 《Kotlin项目实战开发》第5章 函数与函数式编程
  10. FT计算机系统,芯片CP/FT测试的基本概念理解
  11. JAVA生成随机数工具类
  12. 斐讯K2路由编译Padavan华硕固件和心得
  13. 滨州学院CSDN高校俱乐部 策划书
  14. pycharm读取CSV文件
  15. golang简介_Golang简介
  16. 科技热点周刊|Linux 30 周年、Horizon Workroom 发布、Humanoid Robot、元宇宙
  17. 什么是体素(Voxel)
  18. GitCode 加速同步 GitHub
  19. python warning
  20. 信息管理系统的登录注册

热门文章

  1. http://blog.csdn.net/myan/article/details/1906
  2. Xcode4.5编译ffmpeg成功,过程说明
  3. Jquey将序列化对象在前台显示地几种方式
  4. linux 文件系统的管理 (硬盘)
  5. js.domReady
  6. asp.net中gridview 如果字数太多可以用此方法把字体变短+.....
  7. 用html编写ASCII表,HTML ASCII
  8. 利用正则表达式截取特定字符中间字符
  9. Mybatis批量更新数据
  10. [No000022]他们说:得诺贝尔奖到底有多难?