博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在 Asp.Net Core 中对请求进行限流
阅读量:4035 次
发布时间:2019-05-24

本文共 3170 字,大约阅读时间需要 10 分钟。

译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html

在应用程序开发时,或许你有这样的想法,控制用户的请求频率来防止一些用户的恶意攻击,具体的说就是:为了预防有名的 拒绝服务 攻击,限制某一个ip在一段时间内的访问次数,要解决这个问题,就要用到限流机制。

限流能够很好的控制住一个客户端访问服务器资源地址的请求次数,在 asp.net core 之前,要实现限流机制,你可能要自定义 module 或者 handler,太繁琐了,不过很开心的是,在 asp.net core 里,可以很轻松的实现限流功能,这得益于 asp.net core 特有的 pipeline 机制,接下来,我们一起研究一下如何在 asp.net core 中实现限流机制。

安装 限流中间件

为了能够实现限流功能,可以使用第三方提供的限流中间件,利用这个中间件给多个场景进行限流,比如:允许某一个 ip 或者 ip段 在指定的时间周期内访问某一个资源的次数,这个周期可以是:每秒,每分钟,每 n 分钟,等等。

在 Visual Studio 中创建好 ASP.NET Core API 之后,下一步就是安装 限流包 AspNetCoreRateLimit,你可以在 NuGet Package Manager 可视化工具上安装,也可以在 .NET CLI 命令行中安装,语句如下:

dotnet add package AspNetCoreRateLimit

如果想了解限流包 AspNetCoreRateLimit  的更多知识,参考 github:https://github.com/stefanprodan/AspNetCoreRateLimit

配置 AspNetCoreRateLimit

现在 AspNetCoreRateLimit 已经引用到我们项目中了,接下来在 ConfigureServices 方法中追加如下代码,最终将请求追加到 request-response pipeline 管道中。

    public class Startup    {        // This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)        {            services.AddMvc().SetCompatibilityVersion                        (CompatibilityVersion.Version_2_2);            services.AddOptions();            services.AddMemoryCache();            services.Configure
            (Configuration.GetSection("IpRateLimit"));            services.AddSingleton
();            services.AddSingleton
();            services.AddSingleton
();            services.AddHttpContextAccessor();        }    }

上面代码 Configuration.GetSection("IpRateLimit") 需要注意一下, 节点 IpRateLimit 的具体限流信息是配在 appsettings.json 中的。

接下来在 Configure 方法中使用限流中间件。

    public class Startup    {        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            app.UseRouting();            app.UseIpRateLimiting();            app.UseAuthorization();            app.UseEndpoints(endpoints =>            {                endpoints.MapControllers();            });        }    }

最后再来看一下 appsettings.json 文件,着重看一下 限流规则 是怎么配置的,可以看出一个限流规则是由 端点 + 周期 + 次数 3个元素组成的,完整的 appsettings.json 配置如下:

{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft": "Warning",      "Microsoft.Hosting.Lifetime": "Information"    }  },  "AllowedHosts": "*",  "IpRateLimit": {    "EnableEndpointRateLimiting": true,    "StackBlockedRequests": false,    "RealIPHeader": "X-Real-IP",    "ClientIdHeader": "X-ClientId",    "HttpStatusCode": 429,    "GeneralRules": [      {        "Endpoint": "*/weatherforecast",        "Period": "1m",        "Limit": 5      }    ]  }}

上面的限流规则可以确保:含有 "/api" 的 url 链接在任何分钟周期内最多有5次访问。

测试 AspNetCoreRateLimit

下面就可以按下 Ctrl + F5 把应用程序跑起来,默认情况下请求会访问 ValueController 的 Get 方法,然后刷新页面5次,会看到页面出现如下信息。

因为是演示目的,所以这里我配置成了5次,实际开发中,大家可以根据项目的具体情况来设置这个限流阈值,当然更灵活的做法就是将 限流次数 保存在 数据库 或者缓存中,这样可以在程序运行过程中动态的修改这个阈值,太强大了。

转载地址:http://gmkdi.baihongyu.com/

你可能感兴趣的文章
STL::deque以及由其实现的queue和stack
查看>>
WAV文件解析
查看>>
DAC输出音乐2-解决pu pu 声
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
flutter-实现一个下拉刷新上拉加载的列表
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>