ASP.NET 和 ASP.NET Core 获取访问者真实 IP 地址的最佳实践

在 ASP.NET 中获取访问者真实 IP 地址

在传统的 ASP.NET 应用中,获取客户端 IP 地址通常使用以下方式:

string userIp = Request.ServerVariables["REMOTE_ADDR"];
if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
{:contentReference[oaicite:24]{index=24}
    userIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}:contentReference[oaicite:25]{index=25}

REMOTE_ADDR 返回直接连接到服务器的客户端 IP 地址,但如果客户端通过代理服务器访问,则该值可能是代理服务器的 IP。此时,可以尝试使用 HTTP_X_FORWARDED_FOR,该头部通常包含客户端的原始 IP 地址。

需要注意的是,HTTP_X_FORWARDED_FOR 可能包含多个 IP 地址,格式如下:

X-Forwarded-For: client1, proxy1, proxy2

在 ASP.NET Core 中获取访问者真实 IP 地址

在 ASP.NET Core 中,可以通过 HttpContext.Connection.RemoteIpAddress 获取客户端 IP 地址:

string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();

然而,当应用部署在使用反向代理(如 Nginx)的环境中时,RemoteIpAddress 可能返回代理服务器的 IP 地址。为了获取真实的客户端 IP,需要配置中间件以处理转发的头部信息。

在 Startup.cs 的 ConfigureServices 方法中添加:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownNetworks.Clear(); // 可选,根据实际情况配置
    options.KnownProxies.Clear();  // 可选,根据实际情况配置
});

在 Configure 方法中添加中间件:

app.UseForwardedHeaders();

配置完成后,可以使用以下代码获取真实的客户端 IP:

string realIp = HttpContext.Connection.RemoteIpAddress?.ToString();

如果需要获取 X-Real-IP 或 X-Forwarded-For 头部的值,也可以直接访问请求头:

if (Request.Headers.ContainsKey("X-Real-IP"))
{
    string realIp = Request.Headers["X-Real-IP"];
}
评论