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 限流中间件学习相关推荐

  1. 【Dnc.Api.Throttle】适用于.Net Core WebApi接口限流框架

    Dnc.Api.Throttle    适用于Dot Net Core的WebApi接口限流框架 使用Dnc.Api.Throttle可以使您轻松实现WebApi接口的限流管理.Dnc.Api.Thr ...

  2. 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit

    在 上一篇 文章中,博主带领大家一起深入了解 ConcurrencyLimiter 这个中间件,正当我得意洋洋地向 Catcher Wong 大佬吹嘘这一点小收获时,大佬一脸嫌弃地说,一个单机版的方案 ...

  3. 【源码解读】Vue与ASP.NET Core WebAPI的集成

    在前面博文[Vue]Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命 ...

  4. NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?

    咨询区 rianjs: 在 ASP.NET Core WebAPI 中,我的 Controller 代码如下: [Route("create-license/{licenseKey}&quo ...

  5. 【Vue】Vue与ASP.NET Core WebAPI的集成

    SPA单页面应用已经遍地开花,熟知的三大框架,Angular.Vue和React,其中Angular与React均可集成至ASP.NET Core,且提供了相关了中间件.但是Vue没有: " ...

  6. ASP.NET CORE WEBAPI文件下载

    最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1.考虑如下场景: 文件是程序生成的. 文件应该能兼容各种格式. 浏览器可以感知进行下载. 准备 经过简单的 ...

  7. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

  8. 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...

  9. Vue + Element+ ASP.NET Core WebAPI 文件上传下载

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备asp.net后端文件上传的API Uplo ...

  10. IIS部署asp.net core webapi

    一.需要安装Windows Server Hosting,作用是让IIS有方向代理功能(Asp.Net Core Module负责反向代理工作),将请求转发到Kestrel,Windows serve ...

最新文章

  1. 执行spring boot应用三种方式
  2. Tech.Ed 2006 博客园兄弟聚会
  3. 2021 CCF颁奖典礼隆重举行
  4. python多线程爬虫实例-Python3多线程爬虫实例讲解代码
  5. sort,uniq,wc,history命令简介
  6. 【JavaScript高级程序设计】读书笔记之一 —— 理解函数
  7. Leet Code OJ 226. Invert Binary Tree [Difficulty: Easy]
  8. mysql能否在手机端运行_在手机上安装linux并部署mysql,jupyter用于数据探索
  9. opengl 关于glewGetContext没有定义
  10. SSD1306驱动理解
  11. MyEclipse下JSP代码提示
  12. win10如何还原计算机名,win10电脑一键还原教程
  13. 【unity】FPS快速实现全息瞄准镜
  14. windows和linux下源码编译7-Zip(7za)
  15. SEO工作者面试基本都会被问到的问题
  16. php 访问 HTTP 网址
  17. 计算机主板设置怎么恢复出场设置密码,重做系统或者BIOS的恢复出厂,电脑恢复出厂设置方法(图文)...
  18. Java随机生成Mac地址(GitHub源码下载)
  19. 2020icpc上海(重温经典)
  20. C语言鸡汤丨大学C语言学累了吗?先来喝点鸡汤补一补头脑!

热门文章

  1. leveldb学习:DBimpl
  2. synchronized 修饰在 static方法和非static方法的区别
  3. centos7中 npm install express 时Error: Cannot find module 'express'错误
  4. python中的zookeeper-zkpython安装
  5. cocos2d- AtlasSprite AtlasSpriteManager
  6. 常见Sqlite管理工具
  7. mathematica 如何在数组中等间隔插入元素
  8. 特殊Office Communicator 2007 R2 Outlook集成错误
  9. Linux串口驱动分析write
  10. rtp h264注意点(FU-A分包方式说明)