为了账号安全,请及时绑定邮箱和手机立即绑定

AspNetCore 限流中间件IpRateLimitMiddleware 介绍

标签:
C# .NET

    IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一个限流的中间件,用于控制客户端调用API的频次, 如果客户端频繁访问服务器,可以限制它的频率,已降低访问服务器端的压力。或者如果有爬虫在爬取关键数据,也可以限制某个/某些API或者某些IP的每天调取次数, 这样限制他爬取的速度。

 

首先nuget安装 Install-Package AspNetCoreRateLimit ,在Startup中Code以下代码,添加服务和注入

 

StartUp.cs代码

public void ConfigureServices(IServiceCollection services)
{            // needed to load configuration from appsettings.json            services.AddOptions();            // needed to store rate limit counters and ip rules            services.AddMemoryCache();            //load general configuration from appsettings.json
            services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));            //load ip rules from appsettings.json
            services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));            // inject counter and rules stores
            services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
            services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();            // Add framework services.            services.AddMvc();            // https://github.com/aspnet/Hosting/issues/793
            // the IHttpContextAccessor service is not registered by default.            // the clientId/clientIp resolvers use it.
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();            // configuration (resolvers, counter key builders)
            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
 }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseIpRateLimiting();            //if (env.IsDevelopment())            //    app.UseDeveloperExceptionPage();            app.UseMvc();
        }

IPRateLimiting应该在其他中间件之前注册, 否则API请求计算可能不正确。

如果您对应用程序进行负载平衡,则需要使用IDistributedCacheRedis或SQLServer,以便所有的kestrel实例都具有相同的速率限制存储。您应该像这样注入分布式存储,而不是使用MemoryCache:

配置和一般规则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": 1      
        },      
        {        
            "Endpoint": "*",        
            "Period": "15m",        
            "Limit": 100      
         },
         {        
             "Endpoint": "*",        
             "Period": "12h",        
             "Limit": 1000      
          },
          {       
              "Endpoint": "*",        
              "Period": "7d",        
              "Limit": 10000     
           }
     ]  
 }

        如果EnableEndpointRateLimiting设置为false则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制。

        如果EnableEndpointRateLimiting设置为true,则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,则可以GET /api/values每秒呼叫5次,但也可以呼叫5次PUT /api/values

        如果StackBlockedRequests设置为false,拒绝的API调用不会添加到调用次数计数器上。比如: 如果客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等),则必须设置StackBlockedRequeststrue

        在RealIpHeader使用时,你的Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置它。

        将ClientIdHeader被用于提取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。

覆盖特定IP appsettings.json的一般规则:


    IP字段支持IP v4和v6值以及范围,如 "192.168.0.0/24", "fe80::/10" 或 "192.168.0.0-192.168.0.255"。




点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
软件测试工程师
手记
粉丝
3
获赞与收藏
14

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消