如何在 Asp.Net Core 中对请求进行限流
譯文鏈接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html
在應用程序開發時,或許你有這樣的想法,控制用戶的請求頻率來防止一些用戶的惡意攻擊,具體的說就是:為了預防有名的 拒絕服務 攻擊,限制某一個ip在一段時間內的訪問次數,要解決這個問題,就要用到限流機制。
限流能夠很好的控制住一個客戶端訪問服務器資源地址的請求次數,在 asp.net core 之前,要實現限流機制,你可能要自定義 module 或者 handler,太繁瑣了,不過很開心的是,在 asp.net core 里,可以很輕松的實現限流功能,這得益于 asp.net core 特有的 pipeline 機制,接下來,我們一起研究一下如何在 asp.net core 中實現限流機制。
安裝 限流中間件
為了能夠實現限流功能,可以使用第三方提供的限流中間件,利用這個中間件給多個場景進行限流,比如:允許某一個 ip 或者 ip段 在指定的時間周期內訪問某一個資源的次數,這個周期可以是:每秒,每分鐘,每 n 分鐘,等等。
在 Visual Studio 中創建好 ASP.NET Core API 之后,下一步就是安裝 限流包 AspNetCoreRateLimit,你可以在 NuGet Package Manager 可視化工具上安裝,也可以在 .NET CLI 命令行中安裝,語句如下:
dotnet?add?package?AspNetCoreRateLimit如果想了解限流包 AspNetCoreRateLimit ?的更多知識,參考 github:https://github.com/stefanprodan/AspNetCoreRateLimit
配置 AspNetCoreRateLimit
現在 AspNetCoreRateLimit 已經引用到我們項目中了,接下來在 ConfigureServices 方法中追加如下代碼,最終將請求追加到 request-response pipeline 管道中。
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 配置如下:
{"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次訪問。
測試 AspNetCoreRateLimit
下面就可以按下 Ctrl + F5 把應用程序跑起來,默認情況下請求會訪問 ValueController 的 Get 方法,然后刷新頁面5次,會看到頁面出現如下信息。
因為是演示目的,所以這里我配置成了5次,實際開發中,大家可以根據項目的具體情況來設置這個限流閾值,當然更靈活的做法就是將 限流次數 保存在 數據庫 或者緩存中,這樣可以在程序運行過程中動態的修改這個閾值,太強大了。
總結
以上是生活随笔為你收集整理的如何在 Asp.Net Core 中对请求进行限流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GraphQL:和EntityFrame
- 下一篇: ASP.NET Core 5.0新增功能