XForwardedFor | XForwardedProto | Design de API's | CSharp
- XForwardedFor | XForwardedProto | Design de API's | CSharp
📄 Documenta ção — Configuração de ForwardedHeaders no ASP.NET Core
Essa configuração habilita o ASP.NET Core a interpretar corretamente os headers de encaminhamento enviados por proxies/reverse proxies (ex.: Nginx, Traefik, Kubernetes Ingress, Load Balancer).
Com isso, sua aplicação consegue obter informações reais do cliente, como:
- IP real do cliente
- Protocolo original (HTTP/HTTPS)
📌 Código configurado
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
options.KnownNetworks.Add(new AspNetIPNetwork(IPAddress.Parse("172.16.0.0"), 12));
});
✅ O que cada parte faz
1) ForwardedHeaders = XForwardedFor | XForwardedProto
Indica quais headers a aplicação deve confiar e processar:
X-Forwarded-For→ contém o IP original do clienteX-Forwarded-Proto→ indica se o cliente usouhttpouhttps
📌 Resultado:
HttpContext.Connection.RemoteIpAddresspode virar o IP real do clienteHttpRequest.Schemepode virar"https"mesmo que o proxy converse com o backend via HTTP
2) KnownNetworks.Clear() e KnownProxies.Clear()
O ASP.NET Core só aplica os forwarded headers se o proxy for confiável.
Essas duas linhas limpam a lista padrão de proxies confiáveis.
✅ Utilidade:
- Permite configurar manualmente quais redes/proxies serão aceitos
- Evita confiar em proxies desconhecidos por padrão
⚠️ Importante: Se você limpar e não adicionar nenhum KnownNetwork/KnownProxy válido, a aplicação pode ignorar os forwarded headers.
3) KnownNetworks.Add(172.16.0.0/12)
Essa linha define uma rede como “confiável” para encaminhar headers:
options.KnownNetworks.Add(new AspNetIPNetwork(IPAddress.Parse("172.16.0.0"), 12));
Isso inclui o range privado:
✅ 172.16.0.0 até 172.31.255.255
📌 Esse range é muito comum em:
- Docker
- Kubernetes
- Redes internas corporativas
Ou seja: qualquer proxy dentro dessa rede poderá informar X-Forwarded-For e X-Forwarded-Proto, e a aplicação vai aceitar.
✅ Onde usar isso no pipeline
Além de configurar no DI, é obrigatório habilitar no app:
app.UseForwardedHeaders();
📌 O ideal é chamar logo no início, antes de UseAuthentication, UseAuthorization, etc.
✅ Benefícios práticos (exemplos)
Após ativar isso:
✅ IP real:
var ip = HttpContext.Connection.RemoteIpAddress;
✅ Detectar HTTPS corretamente:
var scheme = HttpContext.Request.Scheme; // http/https
✅ Melhor tracing/logs:
client.iphttp.scheme- auditoria por IP real
⚠️ Atenção / riscos de segurança
Se você aceitar forwarded headers de redes erradas, um cliente pode “forjar” o IP enviando:
X-Forwarded-For: 1.2.3.4
Por isso: ✅ só adicione redes/proxies que você confia ✅ evite deixar tudo liberado em produção
✅ Quando essa configuração é necessária
Use quando seu sistema está atrás de:
- Reverse Proxy
- API Gateway
- Kubernetes Ingress
- Cloud Load Balancer
- Docker (com bridge network)