如何在 Asp.Net Core 中对请求进行限流

为什么限流

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

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

安装限流中间件

  • AspNetCoreRateLimit

配置AspNetCoreRateLimit

将请求追加到 request-response pipeline 管道中

  1. public class Startup
  2. {
  3. // This method gets called by the runtime. Use this method to add services to the container.
  4. public void ConfigureServices(IServiceCollection services)
  5. {
  6. services.AddMvc().SetCompatibilityVersion
  7. (CompatibilityVersion.Version_2_2);
  8. services.AddOptions();
  9. services.AddMemoryCache();
  10. services.Configure<IpRateLimitOptions>
  11. (Configuration.GetSection("IpRateLimit"));
  12. services.AddSingleton<IIpPolicyStore,
  13. MemoryCacheIpPolicyStore>();
  14. services.AddSingleton<IRateLimitCounterStore,
  15. MemoryCacheRateLimitCounterStore>();
  16. services.AddSingleton<IRateLimitConfiguration,
  17. RateLimitConfiguration>();
  18. services.AddHttpContextAccessor();
  19. }
  20. }

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

  1. public class Startup
  2. {
  3. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  4. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  5. {
  6. if (env.IsDevelopment())
  7. {
  8. app.UseDeveloperExceptionPage();
  9. }
  10. app.UseRouting();
  11. //使用
  12. app.UseIpRateLimiting();
  13. app.UseAuthorization();
  14. app.UseEndpoints(endpoints =>
  15. {
  16. endpoints.MapControllers();
  17. });
  18. }
  19. }

限流规则

  1. "IpRateLimit": {
  2. "EnableEndpointRateLimiting": true,
  3. "StackBlockedRequests": false,
  4. "RealIPHeader": "X-Real-IP",
  5. "ClientIdHeader": "X-ClientId",
  6. "HttpStatusCode": 429,
  7. "GeneralRules": [
  8. {
  9. "Endpoint": "*/weatherforecast",
  10. "Period": "1m",
  11. "Limit": 5
  12. }
  13. ]
  14. }