PocArquitetura.ApiDefaults
0.21.15-main.1
dotnet add package PocArquitetura.ApiDefaults --version 0.21.15-main.1
NuGet\Install-Package PocArquitetura.ApiDefaults -Version 0.21.15-main.1
<PackageReference Include="PocArquitetura.ApiDefaults" Version="0.21.15-main.1" />
<PackageVersion Include="PocArquitetura.ApiDefaults" Version="0.21.15-main.1" />
<PackageReference Include="PocArquitetura.ApiDefaults" />
paket add PocArquitetura.ApiDefaults --version 0.21.15-main.1
#r "nuget: PocArquitetura.ApiDefaults, 0.21.15-main.1"
#:package PocArquitetura.ApiDefaults@0.21.15-main.1
#addin nuget:?package=PocArquitetura.ApiDefaults&version=0.21.15-main.1&prerelease
#tool nuget:?package=PocArquitetura.ApiDefaults&version=0.21.15-main.1&prerelease
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;fixedcomo 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:
subouClaimTypes.NameIdentifier;client_idouazp, como componente adicional quando presente;merchant_idautorizado 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
IExceptionHandlere 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
/healthe/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 | Versions 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. |
-
net10.0
- Asp.Versioning.Mvc (>= 10.2.1)
- Asp.Versioning.Mvc.ApiExplorer (>= 10.2.1)
- FluentValidation (>= 12.1.1)
- Microsoft.AspNetCore.Authentication.JwtBearer (>= 10.0.12)
- Microsoft.OpenApi (>= 2.12.2)
- OpenTelemetry (>= 1.19.1)
- OpenTelemetry.Exporter.Console (>= 1.19.1)
- OpenTelemetry.Exporter.OpenTelemetryProtocol (>= 1.19.1)
- OpenTelemetry.Extensions.Hosting (>= 1.19.1)
- OpenTelemetry.Instrumentation.AspNetCore (>= 1.19.0)
- OpenTelemetry.Instrumentation.Http (>= 1.19.0)
- OpenTelemetry.Instrumentation.Runtime (>= 1.19.0)
- PocArquitetura.HttpResilienceDefaults (>= 0.21.15-main.1)
- Swashbuckle.AspNetCore (>= 10.2.3)
- Swashbuckle.AspNetCore.Annotations (>= 10.2.3)
- System.IdentityModel.Tokens.Jwt (>= 8.23.0)
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 |