ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习
AspNetCoreRateLimit介绍:
AspNetCoreRateLimit是ASP.NET核心速率限制框架,能够对WebApi,Mvc中控制限流,AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件,每个中间件都可以为不同的场景设置多个限,该框架的作者是stefanprodan,项目nuget地址是https://github.com/stefanprodan/AspNetCoreRateLimit。
对客户端IP限流控制。
首先nuget安装 Install-Package AspNetCoreRateLimit ,在Startup中Code以下代码,添加服务和注入,其中的配置是什么;注释都有了。
// 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_1);//添加appsettings.jsonservices.AddOptions();//需要存储速率和ip规则services.AddMemoryCache();//加载appsettings.json中的配置项 ,下面三项是加载general,rulesservices.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));//注入计时器和规则services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();//添加框架服务services.AddMvc();}
在Configure中配置RateLimit的启动
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory){loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug();app.UseIpRateLimiting();if (env.IsDevelopment())app.UseDeveloperExceptionPage();app.UseMvc();}
我们还需要再appsettings.json中写入配置和规则:
"IpRateLimiting": {"EnableEndpointRateLimiting": false,"StackBlockedRequests": false,"RealIpHeader": "X-Real-IP","ClientIdHeader": "X-ClientId","HttpStatusCode": 429,"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],"EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],"GeneralRules": [{"Endpoint": "*","Period": "1s","Limit": 2},{"Endpoint": "*","Period": "15m","Limit": 100},{"Endpoint": "*","Period": "12h","Limit": 1000},{"Endpoint": "*","Period": "7d","Limit": 10000}]}
如果EnableEndpointRateLimiting设置为false,那么这些限制就全局使用,例如,如果设置每秒5次调用的限制,对任何端口的任何http调用都计入这个限制,反之,如果它是true,那么该限制将应用于{端口}{path}中的每个端点。
如果stackblockedrequest设置为false,则不会将拒绝调用添加到节流阀计数器,如果你要拒绝你必须设置为true;
ClientidHeader用于提取白清单的客户端id,如果客户端id在这个里面,就不会应用速率限制。
覆盖特定IP一般规则:
"IpRateLimitPolicies": {"IpRules": [{"Ip": "84.247.85.224","Rules": [{"Endpoint": "*","Period": "1s","Limit": 10},{"Endpoint": "*","Period": "15m","Limit": 200}]},{"Ip": "192.168.3.22/25","Rules": [{"Endpoint": "*","Period": "1s","Limit": 5},{"Endpoint": "*","Period": "15m","Limit": 150},{"Endpoint": "*","Period": "12h","Limit": 500}]}]}
IP字段支持IP v4和v6值,我们还需要去定义速率限制规则
规则由端点,期间和限制组成,示例(将所有的端点的速率限制每秒2次呼叫),那么定义如下:
{"Endpoint": "*", "Period": "1s", "Limit": 2 }
如果在同一端点,例如get/values在一秒中你调用了3次,那么第三次将会被阻止;但是如果说你在同一秒内还调用了Put/values那么不会阻止,因为他们不是在同一端点之中。在期间(Period)中,还有单位 s m h 等.
有的时候我们对拦截有一定的自定义需求的时候,我们可以继承IpRateLimitMiddleware,如以下定义:
public class CustomizationLimitMiddleware : IpRateLimitMiddleware{private readonly IpRateLimitOptions _options;private readonly IIpPolicyStore _ipPolicyStore;public CustomizationLimitMiddleware(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, ILogger<IpRateLimitMiddleware> logger, IIpAddressParser ipParser = null) : base(next, options, counterStore, policyStore, logger, ipParser){_options = options.Value;_ipPolicyStore = policyStore;}public override ClientRequestIdentity SetIdentity(HttpContext httpContext){var clientId = "anon";if (httpContext.Request.Headers.Keys.Contains(_options.ClientIdHeader, StringComparer.CurrentCultureIgnoreCase)){clientId = httpContext.Request.Headers[_options.ClientIdHeader].First();}return new ClientRequestIdentity{Path = httpContext.Request.Path.ToString().ToLowerInvariant(),HttpVerb = httpContext.Request.Method.ToLowerInvariant(),ClientId = clientId};}}
行为
当客户端进行HTTP调用时,IpRateLimitMiddleware执行以下操作:
- 从请求体中获取IP,客户端IP,Http信息,和一些URL,如果需要修改自己的提取逻辑,可以覆盖IpRateLimitMiddleware.SetIdentity。
- 在白名单中搜索IP,客户端ID和URL,如果有匹配则不执行任何操作
- 在IP规则中搜索匹配项,所有适用的规则按期间分组,对于每个期间使用最严格的规则
- 在匹配的一般规则中搜索,如果匹配的一般规则具有IP规则中不存在的定义时间段,则也使用此一般规则
- 对于每个匹配规则,速率限制计数器递增,如果计数器值大于规则限制,则请求被阻止
如果请求被阻止,则客户端会收到如下文本响应:
Status Code: 429
Retry-After: 58
Content: API calls quota exceeded! maximum admitted 2 per 1m.
如果请求没有得到速率限制,那么匹配规则中定义的最长周期用于组成X-Rate-Limit标头,这些标头将在响应中注入:
X-Rate-Limit-Limit: the rate limit period (eg. 1m, 12h, 1d)
X-Rate-Limit-Remaining: number of request remaining
X-Rate-Limit-Reset: UTC date time (ISO 8601) when the limits resets
默认情况下,组织了客户端的调用我们都会记录到日志中,那么我们可以使用Microsoft.Extensions.Logging.ILogger,这个就略过了。
我们有的时候需要添加ip规则或者更新速率,如一下所示:
public class IpRateLimitController : Controller
{private readonly IpRateLimitOptions _options;private readonly IIpPolicyStore _ipPolicyStore;public IpRateLimitController(IOptions<IpRateLimitOptions> optionsAccessor, IIpPolicyStore ipPolicyStore){_options = optionsAccessor.Value;_ipPolicyStore = ipPolicyStore;}[HttpGet]public IpRateLimitPolicies Get(){return _ipPolicyStore.Get(_options.IpPolicyPrefix);}[HttpPost]public void Post(){var pol = _ipPolicyStore.Get(_options.IpPolicyPrefix);//addpol.IpRules.Add(new IpRateLimitPolicy{Ip = "8.8.4.4",Rules = new List<RateLimitRule>(new RateLimitRule[] {new RateLimitRule {Endpoint = "*:/api/testupdate",Limit = 100,Period = "1d" }})});//update_ipPolicyStore.Set(_options.IpPolicyPrefix, pol);}
}
这样呢,你可以将ip限制的规则放到数据库中再推送到缓存中。
转载于:https://www.cnblogs.com/ZaraNet/p/10119475.html
ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习相关推荐
- 【Dnc.Api.Throttle】适用于.Net Core WebApi接口限流框架
Dnc.Api.Throttle 适用于Dot Net Core的WebApi接口限流框架 使用Dnc.Api.Throttle可以使您轻松实现WebApi接口的限流管理.Dnc.Api.Thr ...
- 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit
在 上一篇 文章中,博主带领大家一起深入了解 ConcurrencyLimiter 这个中间件,正当我得意洋洋地向 Catcher Wong 大佬吹嘘这一点小收获时,大佬一脸嫌弃地说,一个单机版的方案 ...
- 【源码解读】Vue与ASP.NET Core WebAPI的集成
在前面博文[Vue]Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命 ...
- NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?
咨询区 rianjs: 在 ASP.NET Core WebAPI 中,我的 Controller 代码如下: [Route("create-license/{licenseKey}&quo ...
- 【Vue】Vue与ASP.NET Core WebAPI的集成
SPA单页面应用已经遍地开花,熟知的三大框架,Angular.Vue和React,其中Angular与React均可集成至ASP.NET Core,且提供了相关了中间件.但是Vue没有: " ...
- ASP.NET CORE WEBAPI文件下载
最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1.考虑如下场景: 文件是程序生成的. 文件应该能兼容各种格式. 浏览器可以感知进行下载. 准备 经过简单的 ...
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...
- Vue + Element+ ASP.NET Core WebAPI 文件上传下载
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备asp.net后端文件上传的API Uplo ...
- IIS部署asp.net core webapi
一.需要安装Windows Server Hosting,作用是让IIS有方向代理功能(Asp.Net Core Module负责反向代理工作),将请求转发到Kestrel,Windows serve ...
最新文章
- 执行spring boot应用三种方式
- Tech.Ed 2006 博客园兄弟聚会
- 2021 CCF颁奖典礼隆重举行
- python多线程爬虫实例-Python3多线程爬虫实例讲解代码
- sort,uniq,wc,history命令简介
- 【JavaScript高级程序设计】读书笔记之一 —— 理解函数
- Leet Code OJ 226. Invert Binary Tree [Difficulty: Easy]
- mysql能否在手机端运行_在手机上安装linux并部署mysql,jupyter用于数据探索
- opengl 关于glewGetContext没有定义
- SSD1306驱动理解
- MyEclipse下JSP代码提示
- win10如何还原计算机名,win10电脑一键还原教程
- 【unity】FPS快速实现全息瞄准镜
- windows和linux下源码编译7-Zip(7za)
- SEO工作者面试基本都会被问到的问题
- php 访问 HTTP 网址
- 计算机主板设置怎么恢复出场设置密码,重做系统或者BIOS的恢复出厂,电脑恢复出厂设置方法(图文)...
- Java随机生成Mac地址(GitHub源码下载)
- 2020icpc上海(重温经典)
- C语言鸡汤丨大学C语言学累了吗?先来喝点鸡汤补一补头脑!
热门文章
- leveldb学习:DBimpl
- synchronized 修饰在 static方法和非static方法的区别
- centos7中 npm install express 时Error: Cannot find module 'express'错误
- python中的zookeeper-zkpython安装
- cocos2d- AtlasSprite AtlasSpriteManager
- 常见Sqlite管理工具
- mathematica 如何在数组中等间隔插入元素
- 特殊Office Communicator 2007 R2 Outlook集成错误
- Linux串口驱动分析write
- rtp h264注意点(FU-A分包方式说明)