Nginx反代.NET服务时认证Header丢失的主因是默认丢弃含下划线的头字段且未显式透传Authorization等关键头;需在http块启用underscores_in_headers on,并在location中用proxy_set_header显式转发Authorization、X-Auth-Token等头及Host、X-Forwarded-Proto等必要字段。

反代 .NET 服务时身份验证 Header(如 Authorization、X-Auth-Token、API-Key 等)丢失,是生产环境中高频且隐蔽的故障。根本原因往往不是配置遗漏,而是 Nginx 对请求头的默认过滤策略与 .NET 服务对头字段的严格解析共同导致的。解决需分两步:先保头不丢,再确保头能被后端正确识别。
确认是否因下划线触发默认丢弃
.NET 服务常使用带下划线的自定义认证头,例如 Auth_Token、X_API_Key、Bearer_Token。Nginx 默认将含下划线(_)的 header 视为非法字段并静默丢弃(underscores_in_headers off 是默认行为)。
- 检查你的认证 Header 名称是否含下划线(如
auth_token、x_user_id) - 在 Nginx 主配置文件(
/etc/nginx/nginx.conf)的http块顶层添加:underscores_in_headers on; - 该指令不能放在
server或location块内,否则无效 - 执行
nginx -t && nginx -s reload生效
显式透传 Authorization 及其他关键认证头
Nginx 默认不会自动转发 Authorization 头(即使不含下划线),必须手动声明。.NET 的 Microsoft.AspNetCore.Authentication 中间件严重依赖该头解析 Bearer Token。
- 在
location块中添加:proxy_set_header Authorization $http_authorization; - 若使用自定义头(如
X-Auth-Token),同样需显式透传:proxy_set_header X-Auth-Token $http_x_auth_token; - 注意变量命名规则:
$http_+ 小写 + 下划线替换短横(X-Auth-Token→$http_x_auth_token)
避免 Host 和协议信息错乱影响 .NET 身份验证中间件
.NET 的某些认证流程(如 OpenID Connect 回调、Cookie 同源校验、JWT Issuer 验证)会依赖原始请求的 Host 和协议(http/https)。Nginx 若覆盖或简化这些头,会导致签名失败或重定向异常。
- 用
$http_host替代$host,保留客户端原始 Host(含端口):proxy_set_header Host $http_host; - 强制传递协议信息:
proxy_set_header X-Forwarded-Proto $scheme; - 如需 .NET 应用读取真实客户端 IP 做风控或限流,补充:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
验证与调试建议
不要仅依赖日志或后端报错——要端到端抓取真实 header 流转。
- 在 .NET 控制器中临时加一行:
Console.WriteLine(string.Join(", ", Request.Headers.Select(h => $"{h.Key}={h.Value}"))); - 用
curl -v -H "Authorization: Bearer xxx" https://your-domain/api/test直接测试,观察响应头和后端日志输出 - 检查 Nginx access log 是否记录了该 header(需在
log_format中显式加入$http_authorization) - 若使用 Kubernetes Ingress,需通过 annotation 注入:
nginx.ingress.kubernetes.io/server-snippet: "underscores_in_headers on;"


















