首页 > Web开发 > 详细

ASP.NET Core如何限制请求频率

时间:2019-11-22 21:20:55      阅读:218      评论:0      收藏:0      [点我收藏+]
原文:ASP.NET Core如何限制请求频率

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38613453/article/details/103131788

ASP.NET Core如何限制请求频率,为了防止恶意请求,我们往往会对接口请求的频率做限制,比如请求间隔,一段时间内请求的次数,针对部分IP做出不同的限制策略

 

如何去限制请求频率不需要我们去实现,用上AspNetCoreRateLimit 轮子就好了??

Github地址:https://github.com/stefanprodan/AspNetCoreRateLimit

 

Nuget下载

Install-Package AspNetCoreRateLimit

 

第一步自然是修改Startup.cs

 

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. // 需要从appsettings.json中加载配置
  4. services.AddOptions();
  5. // 存储IP计数器及配置规则
  6. services.AddMemoryCache();
  7. services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
  8. services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
  9. services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
  10. // 按照文档,这两个是3.x版的breaking change,要加上
  11. services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
  12. services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
  13. }
  14. //以及
  15. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  16. {
  17. // 注意顺序,放在 UseMvc 上面
  18. app.UseIpRateLimiting();
  19. app.UseMvc();
  20. }

 

然后向appsettings.json加入限制配置

 

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

 

EnableEndpointRateLimiting设置为true,意思是IP限制会应用于单个配置的Endpoint上。如果是false的话,只会限制所有 * 的规则,而不能达到针对单个Endpoint配置的目的。

HttpStatusCode设置为429,意思是触发限制之后给客户端返回的HTTP状态码。

GeneralRules里我只配置了一条,针对/Home这URL的限制。其中,开头的 *: 表示任何HTTP VERB,如GET/POST,而结尾的 /* 表示需要考虑/Home后面的参数,也就是我MVC Action参数里的route参数。它不会匹配

Home也不会匹配Home/*/*

 

如果您在appsettings.json配置文件中定义了静态费率策略,则需要在应用程序启动时为它们添加种子:  

 

  1. public static async Task Main(string[] args)
  2. {
  3. IWebHost webHost = CreateWebHostBuilder(args).Build();
  4. using (var scope = webHost.Services.CreateScope())
  5. {
  6. // get the IpPolicyStore instance
  7. var ipPolicyStore = scope.ServiceProvider.GetRequiredService<IIpPolicyStore>();
  8. // seed IP data from appsettings
  9. await ipPolicyStore.SeedAsync();
  10. }
  11. await webHost.RunAsync();
  12. }

 

如何你这里报找不到合适的入口的错误,点击这里??.NET Core将Main入口修改为Async报错

 

当请求接口超过限制时!!!会出现以下错误

 

技术分享图片

 

轮子还提供动态更新限制策略!!!

 

通过注入IOptions<IpRateLimitOptions> 和IIpPolicyStore可以实时更新限制策略

 

  1. public class SpiderController : BlogControllerBase
  2. {
  3. private readonly IpRateLimitOptions _options;
  4. private readonly IIpPolicyStore _ipPolicyStore;
  5. public SpiderController(IOptions<IpRateLimitOptions> optionsAccessor
  6. , IIpPolicyStore ipPolicyStore)
  7. {
  8. _options = optionsAccessor.Value;
  9. _ipPolicyStore = ipPolicyStore;
  10. }
  11. public async Task<IActionResult> Index(SpiderSelectCondition spiderSelect)
  12. {
  13. var pol = await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix);
  14. pol.IpRules.Add(new IpRateLimitPolicy
  15. {
  16. Ip = "",
  17. Rules = new List<RateLimitRule>(new RateLimitRule[] {
  18. new RateLimitRule {
  19. Endpoint = "*:/Spider/Config",
  20. Limit = 2,
  21. PeriodTimespan=new TimeSpan(0,0,10),
  22. Period ="1d"}
  23. })
  24. });
  25. await _ipPolicyStore.SetAsync(_options.IpPolicyPrefix, pol);
  26. return View();
  27. }

 

PeriodTimespan 为间隔时间

Period 一定时间内可执行Limit

 

更多高级用法可以访问官方文档

 

我都博客Wy博客

技术分享图片

ASP.NET Core如何限制请求频率

原文:https://www.cnblogs.com/lonelyxmas/p/11913768.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!