ASP.NET Core使用Middleware设置有条件允许访问路由
1.简介
有时,我们可能在Web API中包含一些具有调试功能的请求。比如我们上次的文章中 为什么ASP.NET Core 数据库连接串的值和appsettings.json配的不一样?使用的获取配置值的功能:
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
实现的简单方案。
2.实现
从上图可以看到,请求要访问到实际路由,需要先经过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错误。
效果如下图:
到此这篇关于ASP.NET Core使用Middleware设置有条件允许访问路由的文章就介绍到这了,更多相关ASP.NET Core使用Middleware有条件允许访问路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
ASP.NET MVC Web API HttpClient简介
依稀还记得那个时候用WebClient,HttpWebRequest来发送一个请求,现在ASP.NET MVC4中自带了一个类HttpClient;需要的朋友可以参考下2012-11-11.NET 6新特性试用Timer类之PeriodicTimer
这篇文章主要介绍了.NET 6新特性试用Timer类之PeriodicTimer,PeriodicTimer与其他Timer需要创建事件回调不同,下,下面文章详细介绍PeriodicTimer的使用方式,需要的朋友可以参考一下2022-02-02ASP.NET Core Web API 教程Project Configuration
本文将介绍 Startup 类中的配置方法以及如何通过这些方法来设置应用程序。除此之外,还将介绍如何注册服务以及如何通过扩展方法来实现注册,需要的朋友可以参考下面文章内容2021-09-09
最新评论