ASP.NET Core (.NET 7) 中的速率限制中间件

发布时间 2023-12-31 21:32:47作者: leviliang

ASP.NET Core 中的速率限制中间件可以用于限制特定资源在一段时间内允许的请求次数。速率限制可以用于保护服务器资源,防止拒绝服务 (DoS) 攻击。Microsoft.AspNetCore.RateLimiting 或 AspNetCoreRateLimit 中间件提供速率限制中间件。 应用可配置速率限制策略,然后将策略附加到终结点。

1、速率限制器算法

在ASP.NET Core 中实现速率限制时,通常会使用特定的算法来决定何时以及如何限制请求。这些算法可以基于不同的标准,如IP地址、客户端ID或用户账号。

Microsoft.AspNetCore.RateLimiting 中间件用于限制速率,支持四种扩展方法。

1)固定窗口

AddFixedWindowLimiter 方法使用固定的时间窗口来限制请求。 当时间窗口过期时,会启动一个新的时间窗口,并重置请求限制

2)滑动窗口

与固定窗口限制器类似,但为每个窗口添加了段。 窗口在每个段间隔滑动一段。 段间隔的计算方式是:(窗口时间)/(每个窗口的段数)。

将窗口的请求数限制为 permitLimit 个请求。每个时间窗口划分为一个窗口 n 个段。从倒退一个窗口的过期时间段(当前段之前的 n 个段)获取的请求会添加到当前的段。 我们将倒退一个窗口最近过期时间段称为“过期的段”。

3)令牌桶

令牌桶限制器与滑动窗口限制器类似,但它不会结存从过期段获取的请求数,而是在每个补充期间添加固定数量的令牌。 每个段添加的令牌数不能使可用令牌数超过令牌桶限制。

4)并发

并发限制器会限制并发请求数。 每添加一个请求,在并发限制中减去 1。 一个请求完成时,在限制中增加 1。 其他请求限制器限制的是指定时间段的请求总数,而与它们不同,并发限制器仅限制并发请求数,不对一段时间内的请求数设置上限。

2、Microsoft.AspNetCore.RateLimiting

Microsoft.AspNetCore.RateLimiting 是微软官方提供的速率限制中间件,Microsoft.AspNetCore.RateLimiting 是 ASP.NET Core 中提供的内置速率限制包,它可以帮助控制应用程序中资源的访问频率,防止出现DoS攻击或过度消耗资源。它提供了基本的速率限制功能,适用于简单的场景。

使用示例:ASP.NET Core (.NET 7) 中的速率限制中间件

3、AspNetCoreRateLimit

AspNetCoreRateLimit 是一个第三方库,提供了一套丰富的速率限制功能。它支持IP限制和客户端ID限制策略。保护API免受过度使用和潜在的滥用。通过合理配置,可以有效地管理客户端的请求频率,确保服务的稳定性和可用性。可以存储在内存中,也可以配置为使用分布式存储(如Redis)来实现跨多个应用实例的速率限制。

1)安装引用 AspNetCoreRateLimit

在Nuget管理程序中,搜索 "AspNetCoreRateLimit",然后点击安装。

或者使用Package Manager命令安装 PM> Install-Package Serilog

注意:使用Redis,还需要安装AspNetCoreRateLimit.Redis包。

相关文档:VS(Visual Studio)中Nuget的使用

2)基于客户端IP速率限制

 使用示例:ASP.NET Core (.NET 7) 中的速率限制中间件

3)基于客户端ID速率限制

 使用示例:ASP.NET Core (.NET 7) 中的速率限制中间件