ASP.NET Core API 如何仅对登录路由的失败请求做速率限制
实现方案
方案1:原生IMemoryCache实现(单实例部署场景)
不需要引入第三方组件,轻量适配中小流量场景:
- 先在
Program.cs中注册内存缓存服务:
builder.Services.AddMemoryCache();
- 修改Login接口所在Controller,注入
IMemoryCache,调整登录逻辑:
private readonly IMemoryCache _cache; // 构造函数注入 public YourController(IMemoryCache cache) { _cache = cache; } [HttpPost("login")] public async Task<ActionResult<AuthViewModel>> Login([FromBody] UserLoginViewModel userLoginVm) { // 构造缓存键,建议组合用户名+客户端IP,防止单IP爆破多账号/单账号多IP爆破 var clientIp = Request.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown_ip"; var cacheKey = $"login_fail:{userLoginVm.Username}:{clientIp}"; // 读取当前失败次数 var failCount = _cache.Get<int>(cacheKey); // 可根据需求调整阈值,这里设为5次,锁定15分钟 if (failCount >= 5) { return StatusCode(StatusCodes.Status429TooManyRequests, "登录失败次数过多,请15分钟后再试"); } var auth = await service.Login(userLoginVm); if (auth == null) { // 登录失败,计数+1,设置过期时间15分钟 _cache.Set(cacheKey, failCount + 1, TimeSpan.FromMinutes(15)); return BadRequest("Wrong login."); } // 登录成功,清除失败计数 _cache.Remove(cacheKey); return Ok(auth); }
方案2:分布式缓存实现(多实例/集群部署场景)
如果你的API是分布式部署的,内存缓存无法跨实例共享计数,把IMemoryCache替换为ASP.NET Core自带的IDistributedCache即可,逻辑和上面一致,存储时转成数值类型存取即可,常用Redis作为分布式缓存实现。
注意事项
- 失败次数阈值、锁定时长建议写到
appsettings.json配置文件中,避免硬编码,方便后续调整 - 若需要更复杂的限流规则(比如全局限流、不同接口不同限流策略),也可以集成AspNetCoreRateLimit类库实现,无需自己写计数逻辑
内容的提问来源于stack exchange,提问作者leafar29
相关产品推荐
相关产品推荐

