如何在 Asp.Net Core 中對請求進行限流

譯文連接: https://www.infoworld.com/art...

在應用程序開發時,或許你有這樣的想法,控制用戶的請求頻率來防止一些用戶的惡意攻擊,具體的說就是:爲了預防有名的 拒絕服務 攻擊,限制某一個ip在一段時間內的訪問次數,要解決這個問題,就要用到限流機制。html

限流可以很好的控制住一個客戶端訪問服務器資源地址的請求次數,在 asp.net core 以前,要實現限流機制,你可能要自定義 module 或者 handler,太繁瑣了,不過很開心的是,在 asp.net core 裏,能夠很輕鬆的實現限流功能,這得益於 asp.net core 特有的 pipeline 機制,接下來,咱們一塊兒研究一下如何在 asp.net core 中實現限流機制。git

安裝 限流中間件

爲了可以實現限流功能,可使用第三方提供的限流中間件,利用這個中間件給多個場景進行限流,好比:容許某一個 ip 或者 ip段 在指定的時間週期內訪問某一個資源的次數,這個週期能夠是:每秒,每分鐘,每 n 分鐘,等等。github

在 Visual Studio 中建立好 ASP.NET Core API 以後,下一步就是安裝 限流包 AspNetCoreRateLimit,你能夠在 NuGet Package Manager 可視化工具上安裝,也能夠在 .NET CLI 命令行中安裝,語句以下:數據庫

dotnet add package AspNetCoreRateLimit

若是想了解限流包 AspNetCoreRateLimit 的更多知識,參考 github: https://github.com/stefanprod...json

配置 AspNetCoreRateLimit

如今 AspNetCoreRateLimit 已經引用到咱們項目中了,接下來在 ConfigureServices 方法中追加以下代碼,最終將請求追加到 request-response pipeline 管道中。api

public class Startup
    {
        // 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_2);
            services.AddOptions();
            services.AddMemoryCache();
            services.Configure<IpRateLimitOptions>
            (Configuration.GetSection("IpRateLimit"));
            services.AddSingleton<IIpPolicyStore,
            MemoryCacheIpPolicyStore>();
            services.AddSingleton<IRateLimitCounterStore,
            MemoryCacheRateLimitCounterStore>();
            services.AddSingleton<IRateLimitConfiguration,
            RateLimitConfiguration>();
            services.AddHttpContextAccessor();
        }
    }

上面代碼 Configuration.GetSection("IpRateLimit") 須要注意一下, 節點 IpRateLimit 的具體限流信息是配在 appsettings.json 中的。緩存

接下來在 Configure 方法中使用限流中間件。服務器

public class Startup
    {
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseIpRateLimiting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

最後再來看一下 appsettings.json 文件,着重看一下 限流規則 是怎麼配置的,能夠看出一個限流規則是由 端點 + 週期 + 次數 3個元素組成的,完整的 appsettings.json 配置以下:app

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "IpRateLimit": {
    "EnableEndpointRateLimiting": true,
    "StackBlockedRequests": false,
    "RealIPHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "GeneralRules": [
      {
        "Endpoint": "*/weatherforecast",
        "Period": "1m",
        "Limit": 5
      }
    ]
  }
}

上面的限流規則能夠確保:含有 "/api" 的 url 連接在任何分鐘週期內最多有5次訪問。asp.net

測試 AspNetCoreRateLimit

下面就能夠按下 Ctrl + F5 把應用程序跑起來,默認狀況下請求會訪問 ValueController 的 Get 方法,而後刷新頁面5次,會看到頁面出現以下信息。

由於是演示目的,因此這裏我配置成了5次,實際開發中,你們能夠根據項目的具體狀況來設置這個限流閾值,固然更靈活的作法就是將 限流次數 保存在 數據庫 或者緩存中,這樣能夠在程序運行過程當中動態的修改這個閾值,太強大了。

更多高質量乾貨:參見個人 GitHub: dotnetfly
相關文章
相關標籤/搜索