如何在AspNetCoreRateLimit Nuget包中配置端点限流黑名单
AspNetCoreRateLimit 批量端点限流简化配置方案
AspNetCoreRateLimit 原生GeneralRules的Endpoint字段确实不支持数组传值,以下两种方案可以彻底解决配置冗余问题,无需修改库源码,兼容所有正式发布版本:
方案1:开启正则匹配,单条规则覆盖多端点(零代码改动)
库本身内置正则匹配规则支持,默认关闭,只要在配置中打开EnableRegexRuleMatching开关,就可以在Endpoint字段写正则表达式,一次性匹配多个无统一前缀的目标端点。
配置示例如下:
"IpRateLimiting": { "EnableEndpointRateLimiting": true, "StackBlockedRequests": true, "EnableRegexRuleMatching": true, "RealIpHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "IpWhitelist": [], "EndpointWhitelist": [], "ClientWhitelist": [], "GeneralRules": [ { "Endpoint": "regex:(?i)^(get:/api/user/SearchByEmailOrPhone/.*|post:/api/auth/.*|get:/api/user/SetNewsletterSubscription/.*)$", "Period": "15s", "Limit": 3 }, { "Endpoint": "regex:(?i)^(get:/api/user/SearchByEmailOrPhone/.*|post:/api/auth/.*|get:/api/user/SetNewsletterSubscription/.*)$", "Period": "1m", "Limit": 6 }, { "Endpoint": "regex:(?i)^(get:/api/user/SearchByEmailOrPhone/.*|post:/api/auth/.*|get:/api/user/SetNewsletterSubscription/.*)$", "Period": "5m", "Limit": 13 } ] }
正则中(?i)表示忽略路径和请求方法的大小写,避免因为路由大小写差异导致规则失效。后续新增限流端点时,直接在正则的分组内追加对应路径格式即可,无需重复编写多份规则块。
如果待限流的端点有统一的路径前缀,甚至不需要写正则,直接用*通配符即可覆盖,比如所有需要限流的接口都在/api/public/路径下,直接写"Endpoint": "*:/api/public/*"就能匹配所有该路径下的接口。
方案2:启动时动态生成规则(适合大规模端点限流场景)
如果不想维护长正则表达式,可以在应用启动阶段通过代码定义限流端点分组和限流策略,自动批量生成所有规则注入配置,完全避免JSON配置冗余。
实现代码如下:
// 定义需要加入限流黑名单的端点列表 var limitedEndpoints = new[] { "get:/api/user/SearchByEmailOrPhone/*", "post:/api/auth/*", "get:/api/user/SetNewsletterSubscription/*" }; // 定义统一的限流周期与对应阈值 var limitPolicies = new[] { (Period: "15s", Limit: 3), (Period: "1m", Limit: 6), (Period: "5m", Limit: 13) }; // 批量生成所有限流规则 var rules = new List<RateLimitRule>(); foreach (var endpoint in limitedEndpoints) { foreach (var policy in limitPolicies) { rules.Add(new RateLimitRule { Endpoint = endpoint, Period = policy.Period, Limit = policy.Limit }); } } // 注入到限流配置 builder.Services.Configure<IpRateLimitOptions>(options => { // 此处赋值其他基础配置项,如RealIpHeader、HttpStatusCode等 options.GeneralRules = rules; });
这种方式维护成本极低,后续新增限流端点或者调整限流阈值,只需要修改对应的两个列表即可,哪怕有上百个端点需要限流,也不需要写重复配置。
注意:库内置的
EndpointWhitelist仅用于配置放行端点,没有提供对应的批量黑名单配置项,不要尝试通过反向配置白名单实现黑名单逻辑,会导致其他未配置的接口全部被拦截。
内容的提问来源于stack exchange,提问作者bzmind
相关产品推荐
相关产品推荐

