You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core API 如何仅对登录路由的失败请求做速率限制

实现方案

方案1:原生IMemoryCache实现(单实例部署场景)

不需要引入第三方组件,轻量适配中小流量场景:

  1. 先在Program.cs中注册内存缓存服务:
builder.Services.AddMemoryCache();
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:36:00