Rate Limiting Avançado: Proteja sua API com .NET 8+

Imagine sua API🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. sendo bombardeada por milhares de requests por segundo. Servidores superaquecendo, usuários legítimos bloqueados e prejuízos escalando. Rate Limiting Avançado é o guardião que previne esse caos! Em .NET 8+, você tem ferramentas profissionais para criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. barreiras inteligentes contra abusos. Vamos explorar estratégias além do básico, usando o poder do AspNetCore.RateLimiting.

📌 Conteúdo🔗

🔍 O que é Rate Limiting?🔗

O Rate Limiting é uma técnica utilizada para controlar a quantidade de requisições que um cliente pode fazer à sua API num determinado período. Essa disciplina não só protege os recursos do servidor, mas também garante uma experiência🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! de usuário mais estável, evitando que ações maliciosas ou mesmo erros de implementação degradem o serviço.

🚨 Por que usar Rate Limiting?🔗

Imagine que você tem uma API que calcula o preço de fretes. Se alguém começar a fazer milhares de requisições por segundo, seu servidor pode ficar sobrecarregado, e outros usuários legítimos não conseguirão usar o serviço. Sem Rate Limiting, você está basicamente dando carta branca para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! abusos.

Além disso, Rate Limiting ajuda a:

🛠️ Tipos de Políticas de Rate Limiting🔗

No ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real., você pode implementar diferentes tipos de políticas de Rate Limiting:

1. Limite Fixo: Um número fixo de requisições por período de tempo (ex: 100 requisições por minuto).

2. Janela Deslizante (Sliding Window): O limite é recalculado continuamente com base em uma janela de tempo deslizante.

3. Token Bucket: Um balde de tokens é preenchido em uma taxa fixa, e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. cada requisição consome um token.

4. Concurrency: Limita o número de requisições simultâneas.

⚖️ Algoritmos de Controle: Escolha sua Arma!🔗

AlgoritmoCenário IdealCódigo .NET 8
Sliding WindowAPIs com picos temporaisAddSlidingWindowLimiter
Token BucketStreaming de dados constanteAddTokenBucketLimiter
ConcurrencyLimitar conexões simultâneasAddConcurrencyLimiter
CustomizadoRegras específicas de negócioImplemente IRateLimiterPolicy

Sliding Window em Ação:

builder.Services.AddRateLimiter(options =>
{
    options.AddSlidingWindowLimiter("api", limiter =>
    {
        limiter.Window = TimeSpan.FromSeconds(30);
        limiter.PermitLimit = 50;
        limiter.SegmentsPerWindow = 6; // Divide a janela em 6 partes de 5s
        limiter.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    });
});

🛠️ Implementação Prática em .NET 8🔗

Passo 1: Instale o pacote

dotnet add package Microsoft.AspNetCore.RateLimiting

Passo 2: Configure no Program.cs

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRateLimiter(options =>
{
    // Global
    options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
        RateLimitPartition.GetFixedWindowLimiter(
            partitionKey: context.Request.Headers.Host.ToString(),
            factory: partition => new FixedWindowRateLimiterOptions
            {
                AutoReplenishment = true,
                PermitLimit = 1000,
                Window = TimeSpan.FromMinutes(1)
            }));
    // Endpoint específico
    options.AddPolicy("sensivel", context =>
        RateLimitPartition.GetSlidingWindowLimiter(
            partitionKey: context.User.Identity?.Name ?? context.Request.Headers["X-Client-ID"]!,
            factory: _ => new SlidingWindowRateLimiterOptions
            {
                PermitLimit = 20,
                Window = TimeSpan.FromMinutes(1),
                SegmentsPerWindow = 4
            }));
});
var app = builder.Build();
app.UseRateLimiter();

Passo 3: Aplique aos endpoints📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos.

app.MapGet("/api/pagamentos", () => "OK")
   .RequireRateLimiting("sensivel");

🎨 Customização de Políticas🔗

Crie regras complexas:

public class GeoRateLimiterPolicy : IRateLimiterPolicy<string>
{
    public RateLimitPartition<string> GetPartition(HttpContext context)
    {
        var country = context.Request.Headers["CF-IPCountry"];
        var limit = country switch
        {
            "BR" => 500,
            "US" => 1000,
            _ => 100
        };
        return RateLimitPartition.GetFixedWindowLimiter(
            country.ToString(),
            _ => new()
            {
                Window = TimeSpan.FromHours(1),
                PermitLimit = limit
            });
    }
}
// Registro:
options.AddPolicy<string, GeoRateLimiterPolicy>("geo-limit");
  • Limites personalizados por região geográfica usando headers do Cloudflare.

📊 Monitoramento e Logs🔗

Integre com Application Insights:

app.UseRateLimiter();
app.Use(async (context, next) =>
{
    var limiter = context.RequestServices.GetRequiredService<IRateLimiter>();
    var metrics = limiter.GetMetrics();
    var telemetry = context.RequestServices.GetRequiredService<TelemetryClient>();
    telemetry.TrackMetric("RateLimit.RemainingPermits", metrics.CurrentPermits);
    await next();
});

Dados-chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. para monitorar:

  • CurrentPermits: Permissões restantes
  • TotalFailedLeases: Requests bloqueados
  • TotalSuccessfulLeases: Requests permitidos

🧪 Desafio Prático🔗

Objetivo: Implemente um sistema de rate limiting que:

1. Permita 100 requests/min para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! usuários anônimos

2. 500 requests/min para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! usuários autenticados

3. 2000 requests/min para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! clientes com header "X-Partner-Key"

4. Bloqueie totalmente IPs que excedam 3x o limite em 1h

Dicas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados.:

// Combine políticas
options.AddPolicy("camadas", context =>
{
    if (context.Request.Headers.ContainsKey("X-Partner-Key"))
        return RateLimitPartition.GetNoLimiter("partner");
    if (context.User.Identity.IsAuthenticated)
        return RateLimitPartition.GetSlidingWindowLimiter(context.User.Identity.Name!, ...);
    return RateLimitPartition.GetFixedWindowLimiter(context.Connection.RemoteIpAddress?.ToString()!, ...);
});

Próximo nível: Armazene os contadores em Redis para escalabilidade horizontal🚀 Scale Out com Redis: Atenda Milhões de Conexões!🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real.!

builder.Services.AddStackExchangeRedisCache(...);
builder.Services.AddSingleton<IRateLimiterPolicy, DistributedRateLimiter>();

🏁 Práticas Recomendadas e Considerações Finais🔗

No cenário atual, proteger suas APIs com rate limiting é uma prática indispensável para manter a estabilidade e a segurança do seu sistema. Ao implementar técnicas avançadas, você estará preparado para enfrentar desde tráfego intenso até possíveis ataques maliciosos, garantindo sempre uma experiência🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! de serviço de qualidade.

Esperamos que este artigo tenha esclarecido os conceitos e as técnicas necessárias para você aprimorar a proteção das suas APIs. Agora, é hora de colocar a mão na massa e adaptar essas ideias ao seu ambiente ASP.NET Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.! 🚀

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo