loading experience

ASP.NET Core

Rate limiting in ASP.NET Core: proteggere API e form

Limitare le richieste per utente o per indirizzo IP con il middleware integrato, senza librerie esterne.

Rate limiting in ASP.NET Core: proteggere API e form

Un form di login senza limiti invita i tentativi a forza bruta; un'API pubblica senza limiti può essere saturata da un solo client. ASP.NET Core include un middleware di rate limiting configurabile per endpoint.

Ogni client ha il suo contatore: chi esagera riceve 429, gli altri no.
Ogni client ha il suo contatore: chi esagera riceve 429, gli altri no.

Configurazione

builder.Services.AddRateLimiter(o =>
{
    o.RejectionStatusCode = StatusCodes.Status429TooManyRequests;

    o.AddPolicy("login", ctx => RateLimitPartition.GetFixedWindowLimiter(
        ctx.Connection.RemoteIpAddress?.ToString() ?? "sconosciuto",
        _ => new FixedWindowRateLimiterOptions
        {
            PermitLimit = 5,
            Window = TimeSpan.FromMinutes(1)
        }));

    o.AddTokenBucketLimiter("api", t =>
    {
        t.TokenLimit = 100;
        t.TokensPerPeriod = 20;
        t.ReplenishmentPeriod = TimeSpan.FromSeconds(10);
    });
});

var app = builder.Build();
app.UseRateLimiter();

Applicare le policy

app.MapPost("/login", Login).RequireRateLimiting("login");
app.MapGroup("/api").RequireRateLimiting("api");

Con Razor Pages e MVC si usa l'attributo [EnableRateLimiting("login")] sulla pagina o sul controller.

Gli algoritmi disponibili

  • Finestra fissa: N richieste per intervallo; semplice e prevedibile.
  • Finestra scorrevole: evita i picchi a cavallo tra due finestre.
  • Token bucket: consente brevi raffiche mantenendo una media sostenibile.
  • Concorrenza: limita le richieste contemporanee, utile per operazioni pesanti.

Dietro un proxy

Se l'applicazione sta dietro IIS, un bilanciatore o una CDN, l'indirizzo IP del client arriva negli header inoltrati: configura UseForwardedHeaders prima del rate limiter, altrimenti tutti gli utenti sembreranno lo stesso client.

Commenti (0)

Nessun commento ancora.

Lascia un commento