PocArquitetura.ApiDefaults 0.21.15-main.1

This is a prerelease version of PocArquitetura.ApiDefaults.
dotnet add package PocArquitetura.ApiDefaults --version 0.21.15-main.1
                    
NuGet\Install-Package PocArquitetura.ApiDefaults -Version 0.21.15-main.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PocArquitetura.ApiDefaults" Version="0.21.15-main.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PocArquitetura.ApiDefaults" Version="0.21.15-main.1" />
                    
Directory.Packages.props
<PackageReference Include="PocArquitetura.ApiDefaults" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PocArquitetura.ApiDefaults --version 0.21.15-main.1
                    
#r "nuget: PocArquitetura.ApiDefaults, 0.21.15-main.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PocArquitetura.ApiDefaults@0.21.15-main.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PocArquitetura.ApiDefaults&version=0.21.15-main.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=PocArquitetura.ApiDefaults&version=0.21.15-main.1&prerelease
                    
Install as a Cake Tool

PocArquitetura.ApiDefaults

Defaults compartilhados para APIs ASP.NET Core da POC poc-arquitetura.

Use este pacote quando uma API precisar reutilizar configuracoes comuns de borda HTTP, middlewares, Swagger/OpenAPI, versionamento, autenticacao JWT, CORS, rate limiting, health endpoints e OpenTelemetry.

Este pacote depende de PocArquitetura.HttpResilienceDefaults para configurar resiliencia no cliente HTTP usado na obtencao de JWKS.

Instalacao

dotnet add package PocArquitetura.ApiDefaults

Uso basico

using ApiDefaults.Extensions;

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureApiDefaults();

builder.Services.AddApiDefaults<GlobalExceptionHandler>(builder.Configuration);

builder.Services.AddApiJwtBearerAuthentication(
    jwtOptions,
    builder.Environment,
    options => options.RequireAuthenticatedUserByDefault(),
    builder.Configuration);

builder.Services.AddApiOpenTelemetryDefaults(
    serviceName: "Example.Api",
    useConsoleExporter: builder.Environment.IsDevelopment(),
    otlpEndpoint: builder.Configuration["OpenTelemetry:OtlpEndpoint"]);

var app = builder.Build();

app.UseForwardedHeaders();
app.UseApiDefaults();
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();

app.MapApiHealthEndpoints(
    static (_, _) => Task.FromResult(true),
    "Valida dependencias necessarias para aceitar trafego HTTP.");

Forwarded Headers confiaveis

AddApiDefaults configura X-Forwarded-For, X-Forwarded-Proto e X-Forwarded-Host com ForwardLimit = 1. Os hosts aceitos para X-Forwarded-Host devem vir de ForwardedHeaders:AllowedHosts; o pacote compartilhado nao injeta dominios locais nem produtivos por codigo.

Para Docker Compose local com Nginx e IP dinamico:

{
  "ForwardedHeaders": {
    "AllowedHosts": [ "api.localhost", "localhost" ],
    "EnableLocalPermissiveMode": true
  }
}

Use esse modo somente em Development ou Local. Em GKE, Kubernetes, Cloud Run, ingress ou load balancer, configure proxies ou redes confiaveis:

{
  "ForwardedHeaders": {
    "TrustedProxies": [ "10.0.0.10" ],
    "TrustedNetworks": [ "10.128.0.0/20" ],
    "AllowedHosts": [ "api.example.com" ],
    "EnableLocalPermissiveMode": false
  }
}

Ambientes nao locais falham no startup quando nao informam pelo menos um proxy ou CIDR confiavel e pelo menos um host encaminhado nao local. localhost, subdominios .localhost e enderecos de loopback nao satisfazem a validacao de ambientes produtivos.

CORS configuravel

ApiDefaults registra CORS pela secao tipada Cors. O comportamento padrao e fechado: se Cors:Enabled=false ou Cors:AllowedOrigins estiver vazio, UseApiDefaults nao habilita CORS e a API nao emite Access-Control-Allow-Origin.

Exemplo para uma API com consumidor browser:

{
  "Cors": {
    "Enabled": true,
    "AllowedOrigins": [ "https://app.example.com" ],
    "AllowedMethods": [ "GET", "POST" ],
    "AllowedHeaders": [
      "Authorization",
      "Content-Type",
      "Idempotency-Key",
      "X-Correlation-Id"
    ],
    "ExposedHeaders": [ "X-Correlation-Id" ],
    "AllowCredentials": false,
    "PreflightMaxAgeSeconds": 600
  }
}

Origens precisam ser absolutas, usar http ou https e nao podem conter path, query string, fragmento ou wildcard. Nao use CORS como autenticacao ou autorizacao de negocio; clientes server-to-server nao dependem do navegador e nao sao protegidos por CORS.

Para Swagger/OpenAPI, use AddApiSwaggerDefaults<TConfigureSwaggerOptions> e UseApiSwaggerDefaults com uma implementacao de IConfigureOptions<SwaggerGenOptions> especifica da API.

Rate limiting particionado

AddApiDefaults registra policies particionadas em memoria local da replica:

  • authenticated-read;
  • authenticated-write;
  • administrative;
  • anonymous-webhook;
  • fixed como alias legado de escrita autenticada.

Use UseRateLimiter() depois de UseAuthentication() e UseAuthorization() para que as policies autenticadas possam montar a particao com claims do token. Health e readiness mapeados por MapApiHealthEndpoints continuam com DisableRateLimiting().

As chaves autenticadas seguem um modelo misto com predominancia de usuario final quando sub ou ClaimTypes.NameIdentifier existe. A composicao e:

  1. sub ou ClaimTypes.NameIdentifier;
  2. client_id ou azp, como componente adicional quando presente;
  3. merchant_id autorizado quando presente.

Quando nao houver identidade utilizavel, a chave usa fallback por IP remoto normalizado, sem cair em uma particao global vazia. Os valores da chave sao protegidos por hash e as metricas usam apenas labels de baixa cardinalidade. Webhooks anonimos usam RemoteIpAddress apos UseForwardedHeaders; nao leia X-Forwarded-For diretamente em aplicacoes.

Os defaults antigos continuam validos:

{
  "ApiLimits": {
    "RateLimitPermitLimit": 100,
    "RateLimitWindowSeconds": 60,
    "RateLimitQueueLimit": 10
  }
}

Cada policy pode sobrescrever os limites:

{
  "ApiLimits": {
    "AuthenticatedReadRateLimit": {
      "PermitLimit": 300,
      "WindowSeconds": 60,
      "QueueLimit": 0
    },
    "AuthenticatedWriteRateLimit": {
      "PermitLimit": 100,
      "WindowSeconds": 60,
      "QueueLimit": 10
    },
    "AdministrativeRateLimit": {
      "PermitLimit": 30,
      "WindowSeconds": 60,
      "QueueLimit": 0
    },
    "AnonymousWebhookRateLimit": {
      "PermitLimit": 120,
      "WindowSeconds": 60,
      "QueueLimit": 0
    }
  }
}

O modelo nao e distribuido: cada replica mantem seus contadores e janelas. Para limite global por cliente, tenant ou merchant, avalie uma evolucao futura com gateway/API management ou storage externo dedicado.

Recursos

  • Middlewares de correlation id, limite de body e headers de seguranca.
  • Exception handling com IExceptionHandler e Problem Details.
  • Swagger/OpenAPI com versionamento.
  • Autenticacao JWT Bearer com JWKS.
  • CORS configuravel por API e ambiente.
  • Rate limiting particionado por janela fixa local a replica.
  • Endpoints /health e /ready.
  • OpenTelemetry para traces e metricas, incluindo metricas de resiliencia HTTP e rejeicoes de rate limiting com labels de baixa cardinalidade.

Esta e uma biblioteca de estudo/POC. Licenca MIT.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.21.15-main.1 33 9/28/2026
0.21.14-main.1 35 9/28/2026
0.21.9-main.1 51 9/21/2026
0.21.7-main.1 62 9/15/2026
0.21.3-main.2 77 8/31/2026
0.21.1-main.8 79 7/17/2026
0.21.0-main.16 68 7/17/2026
0.20.2-main.4 74 7/16/2026
0.19.5-main.40 70 7/15/2026
0.19.2-main.7 74 7/13/2026
0.18.4-main.8 71 7/3/2026
0.18.3-main.2 225 7/2/2026
0.18.2-main.4 75 7/2/2026