C#怎么实现WebAPI速率限制 C#如何在ASP.NET Core中实现API速率限制防止接口滥用【安全】

张开发
2026/4/19 3:38:48 15 分钟阅读

分享文章

C#怎么实现WebAPI速率限制 C#如何在ASP.NET Core中实现API速率限制防止接口滥用【安全】
AspNetCoreRateLimit最省事但需严格遵循中间件顺序UseRateLimiter()必须在UseRouting()之后、UseEndpoints()之前默认按IP限流代理场景需配置RealIPHeaderEnableEndpointRateLimiting启用路由级限流StackBlockedRequests建议关闭自定义IClientResolveContributor提取Token或ApiKey429响应体为空是因异常中间件误吞非异常需避免捕获。用 AspNetCoreRateLimit 库最省事但得配对中间件顺序直接装 AspNetCoreRateLimit 是当前最主流、维护最勤的方案它不侵入业务逻辑靠中间件拦截请求计数。但很多人装完没效果核心原因就一个中间件注册顺序错了——UseRateLimiter() 必须放在 UseRouting() 之后、UseEndpoints() 或 UseAuthorization() 之前。错误顺序app.UseRateLimiter(); app.UseRouting(); app.UseEndpoints(...); → 完全不生效正确顺序app.UseRouting(); app.UseRateLimiter(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(...);它默认基于客户端 IP 做限流如果 API 走了代理如 Nginx、Cloudflare要手动配置 ClientIpHeader 或用 RealIPHeader 解析真实 IP否则所有请求都算成同一个 IPIRateLimitConfiguration 配置里EnableEndpointRateLimiting 和 StackBlockedRequests 很关键这个接口是整个库的配置入口两个布尔值最容易被忽略却影响行为逻辑EnableEndpointRateLimiting true开启按路由模板如 GET /api/users/{id}限流设为 false 就只按 IP 或客户端 ID 限流无法区分不同接口StackBlockedRequests false建议关掉。开启后被限流的请求会排队等窗口重置用户感知就是“卡住几秒才返回 429”实际反而加重服务压力注意 GeneralRules 中的 Endpoint 字段写法支持通配符比如 GET:/api/health 或 *:/api/v1/*但大小写敏感get: 不行必须小写 get:自定义 IClientResolveContributor 才能按用户 Token 或 AppKey 限流默认只认 IP但真实场景常需按 JWT 用户 ID、API Key 或 Header 中的 X-Api-Key 区分额度。这时必须实现 IClientResolveContributor 接口 Mokker AI AI产品图添加背景

更多文章