ASP.NET Core 后端如何通过 Nginx 获取真实客户端 IP 完整指南

ASP.NET Core 应用部署在 Nginx 反向代理后面时,应用默认获取的是 Nginx 服务器的 IP 地址,而不是真实的客户端 IP。这是因为所有请求都经过 Nginx 转发,导致源 IP 信息丢失。对于需要 记录客户端日志、访问控制或安全策略 的应用来说,这会造成严重影响。

解决方案概览

要解决这个问题,需要在两个层面进行配置:

  1. Nginx 配置:转发客户端 IP 信息到后端

  2. 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 终端代理或多级代理场景下也能正确工作。

相关推荐
GDAL12 小时前
Nginx TCP/UDP四层转发(Stream模块)完整深入教程
tcp/ip·nginx·udp
江畔柳前堤13 小时前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
不会就选b15 小时前
Linux之信号(二)
linux·运维·服务器
GlueNa2SiO316 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
寺中人16 小时前
Linux 基础命令入门实战教程:从零掌握常用操作,新手快速上手
linux·运维·服务器·shell·linux 命令·linux 基础教程·linux 入门
小张成长计划..17 小时前
【Linux】18:基础IO
linux·运维·服务器
扬帆破浪19 小时前
文档自动检查:用 Claude Code、OpenClaw 审 WPS 文件:预览、批注、改正文
运维·服务器·wps
zt1985q19 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
夏雪coding21 小时前
nginx SPA 回落把 CSS 变成了 HTML:一个返回 200 却让样式失效的坑
前端·nginx
白狐_79821 小时前
408计算机网络第3章:以太网交换机与共享式以太网——知识总结
服务器·网络·计算机网络