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.
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.