欢迎访问欧博网址!

沧州租房网:.Net Core连系AspNetCoreRateLimit实现限流

admin1个月前5

前言

  信赖使用过WebApiThrottle的童鞋对AspNetCoreRateLimit应该不生疏,AspNetCoreRateLimit是一个ASP.NET Core速率限制的解决方案,旨在控制客户端凭据IP地址或客户端ID向Web API或MVC应用发出的请求的速率。AspNetCoreRateLimit包罗一个IpRateLimitMiddlewareClientRateLimitMiddleware,每个中间件可以凭据差别的场景设置限制允许IP或客户端,自定义这些限制计谋,也可以将限制计谋应用在每​​个API URL或详细的HTTP Method上。

实践

   早先是由于新做的项目中,有天查询日志发现,对外的几个公共接口经常被“恶意”挪用,考虑到接口平安性问题,增添限流计谋。

  AspNetCoreRateLimit GayHub:https://github.com/stefanprodan/AspNetCoreRateLimit

凭据IP举行限流

  通过nuget安装AspNetCoreRateLimit,当前版本是3.0.5,由于现实项目中用的都是分布式缓存,在这里不用内存存储,而是连系Redis举行使用,内存存储直接参考官方的Wiki就可以了。

Install-Package AspNetCoreRateLimit 

Install-Package Microsoft.Extensions.Caching.Redis

  在Startup.ConfigureServices中将服务和其他依赖注入

public void ConfigureServices(IServiceCollection services)
        {
            #region MVC
            services.AddMvc(
              options =>
              {
                  options.UseCentralRoutePrefix(new RouteAttribute("api/"));
              }
              ).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            #endregion

            services.AddDistributedRedisCache(options =>
            {
                options.Configuration = "127.0.0.1:6379,password=123456,connectTimeout=5000,syncTimeout=10000"; 
                options.InstanceName = "WebRatelimit";
            }); 
            //加载设置
            services.AddOptions();
            //从appsettings.json获取响应设置
            services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
            
            //注入计数器和规则存储
            services.AddSingleton<IIpPolicyStore, DistributedCacheIpPolicyStore>();
            services.AddSingleton<IRateLimitCounterStore, DistributedCacheRateLimitCounterStore>();
            
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            //设置(计数器密钥生成器)
            services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
        }

  在Startup.Configure启用

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            //启用限流,需在UseMvc前面
            app.UseIpRateLimiting();
            app.UseMvc();
        }

  为了不影响appsettings.json的雅观吧,可以新建一个RateLimitConfig.json,并Program中启动加载中增添

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>().ConfigureAppConfiguration((host,config)=> 
                {
                    config.AddJsonFile($"RateLimitConfig.json", optional: true, reloadOnChange: true);
                });

  RateLimitConfig.json 设置如下:

{
  "IpRateLimiting": {
    //false则全局将应用限制,而且仅应用具有作为端点的规则* 。 true则限制将应用于每个端点,如{HTTP_Verb}{PATH}
    "EnableEndpointRateLimiting": true,
    //false则拒绝的API挪用不会添加到挪用次数计数器上
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 200,
    "QuotaExceededResponse": {
      "Content": "{{\"code\":429,\"msg\":\"接见过于频仍,请稍后重试\",\"data\":null}}",
      "ContentType": "application/json",
      "StatusCode": 200
    },
    "IpWhitelist": [ ],
    "EndpointWhitelist": [],
    "ClientWhitelist": [],
    "GeneralRules": [
      {
        "Endpoint": "*:/api/values/test",
        "Period": "5s",
        "Limit": 3
      }
    ]
  }
}

  主要设置说明:

       QuotaExceededResponse 是自定义返回的内容,以是必须设置HttpStatusCodeStatusCode为200。

  GeneralRules是详细的计谋,凭据差别需求设置差别端点即可, Period的单元可以是s, m, h, dLimint是单元时间内的允许接见的次数;

  IpWhitelist是IP白名单,内陆调试或者UAT环境,可以加入响应的IP,略过计谋的限制;

       EndpointWhitelist是端点白名单,若是全局设置了接见计谋,设置端点白名单相当于IP白名单一样,略过计谋的限制;

       其他设置项请参考Wiki:https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/IpRateLimitMiddleware#setup

Fiddler最先测试

测试接口:http://127.0.0.1:5000/api/values/Test

        [HttpGet]
        public object test()
        {
            return "ok";
        }

挪用效果:

 

 挪用次数和剩余挪用次数在Head可以看到,(吃我一个链接:https://www.cnblogs.com/EminemJK/p/12720691.html)

 

 若是挪用跨越计谋后,挪用失败,返回我们自定义的内容

 

 在Redis客户端可以看到计谋的一些情形,沧州租房网:.Net Core连系AspNetCoreRateLimit实现限流 第1张

 其他

  通常在项目中,Authorization授权是少不了了,加入限流后,在被限流的接口挪用后,限流拦截器使得跨域计谋失效,故重写拦截器中间件,继续IpRateLimitMiddleware 即可:

    public class IPLimitMiddleware : IpRateLimitMiddleware
    {
        public IPLimitMiddleware(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, IRateLimitConfiguration config, ILogger<IpRateLimitMiddleware> logger)
            : base(next, options, counterStore, policyStore, config, logger)
        {
        }

        public override Task ReturnQuotaExceededResponse(HttpContext httpContext, RateLimitRule rule, string retryAfter)
        {
            httpContext.Response.Headers.Append("Access-Control-Allow-Origin", "*");
            return base.ReturnQuotaExceededResponse(httpContext, rule, retryAfter);
        }
    }

  然后修改Startup.Configure

        //启用限流,需在UseMvc前面
        //app.UseIpRateLimiting();
        app.UseMiddleware<IPLimitMiddleware>();
        app.UseMvc();        

  稀奇需要注重的坑是,在其他文章的教程中,他们会写成:

        app.UseMiddleware<IPLimitMiddleware>().UseIpRateLimiting();//错误的演示 https://www.cnblogs.com/EminemJK/p/12720691.html

  这些写你测试的时刻会发现,

沧州租房网:.Net Core连系AspNetCoreRateLimit实现限流 第2张

X-Rate-Limit-Remaining 递减量会酿成2,也不是递减1,举栗子,设置如下:

        "Endpoint": "*:/api/values/test",
        "Period": "3s",
        "Limit": 1

示意3秒内可以接见的次数是1一次,当发生挪用的时刻会直接返回被限制的提醒,而不能正常接见接口。

最后

  AspNetCoreRateLimit还可以凭据客户端ID举行设置计谋,详细可以看一下官方的Wiki吧。

 

,

诚信企业在线企业邮局

诚信企业在线企业邮局(现:阳光在线官网)现已开放诚信在线手机版、诚信在线电脑客户端下载。诚信在线娱乐游戏公平、公开、公正,用实力赢取信誉。

上一篇 下一篇

猜你喜欢

最新文章
热门文章
热评文章
随机文章
热门标签