当 ASP.NET Core 应用部署在 Nginx 反向代理后面时,应用默认获取的是 Nginx 服务器的 IP 地址,而不是真实的客户端 IP。这是因为所有请求都经过 Nginx 转发,导致源 IP 信息丢失。对于需要 记录客户端日志、访问控制或安全策略 的应用来说,这会造成严重影响。
解决方案概览
要解决这个问题,需要在两个层面进行配置:
-
Nginx 配置:转发客户端 IP 信息到后端
-
ASP.NET Core 配置:正确读取转发的 IP 信息
一、Nginx 配置
这里我就先部署在80端口
javascript
server {
listen 80;
server_name yourdomain.com;
location / {
# 转发真实 IP 的头部信息
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}
二、ASP.NET Core 配置
在 Program.cs(.NET 6+)中:
cs
var builder = WebApplication.CreateBuilder(args);
// 生产环境开启真实 IP 获取
if (!builder.Environment.IsDevelopment())
{
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
// 信任 Nginx 代理 IP
options.KnownProxies.Clear();
//只信任这一个IP
options.KnownProxies.Add(IPAddress.Parse("192.168.20.90"));
// 如果有多级代理,可调大 ForwardLimit
options.ForwardLimit = 1;
});
}
var app = builder.Build();
// 启用中间件
if (!app.Environment.IsDevelopment())
{
// 必须在认证、路由、CORS 之前
app.UseForwardedHeaders();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
var ip = context.Connection.RemoteIpAddress;
var scheme = context.Request.Scheme;
await context.Response.WriteAsync($"客户端 IP: {ip}, 请求协议: {scheme}");
});
});
app.Run();
通过 Nginx 转发和 ASP.NET Core 的 ForwardedHeaders 中间件,可以安全、准确地获取客户端真实 IP,即使在 HTTPS 终端代理或多级代理场景下也能正确工作。