【问题标题】:Getting a client's IP address获取客户端的 IP 地址
【发布时间】:2019-11-13 09:15:26
【问题描述】:

我正在开发一个 ASP.NET 项目,我需要确定客户端的 IP 地址。

目前,我们的生产服务器上有以下代码

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();

返回与生产服务器的 IP 地址在同一子网中的 IP 地址(即,没有解决我的问题,因为它不是 客户端的 IP 地址)。

但是,在我们的测试服务器上,同一行代码会返回客户端的 IP 地址(所需的结果)。有人知道为什么吗?

我尝试在以下值中使用上述代码行,所有这些值都返回 null 或空字符串:

"HTTP_X_COMING_FROM"
"HTTP_X_FORWARDED_FOR"
"HTTP_X_FORWARDED"
"HTTP_X_REAL_IP"
"HTTP_VIA"
"HTTP_COMING_FROM"
"HTTP_FORWARDED_FOR"
"HTTP_FORWARDED"
"HTTP_FROM"
"HTTP_PROXY_CONNECTION"
"CLIENT_IP"
"FORWARDED"

作为替代方案,我发现以下代码确实返回了一个 IP 数组并包含客户端的 IP 地址(在索引 4 处):

string strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
string ip = addr[4] != null ? addr[4].ToString() : ""; 

在调试时,我注意到 addr 中的 IPAddress 对象有 (A) 地址错误(如果它是 IPv6 地址)或 (B) ScopeId 错误 如果它是 IPv4 地址。这些错误似乎不是问题,但我不确定它们在生产中是否重要。

有没有比我这里更好的方法来获取客户端的 IP 地址?

【问题讨论】:

  • 您的生产流量是否通过负载均衡器?它可以将REMOTE_ADDR 替换为负载均衡器的地址。可能需要将负载均衡器配置为将原始 IP 地址添加到 HTTP_X_FORWARDED_FOR

标签: c# asp.net ip


【解决方案1】:

获取当前 HTTP 请求的 HttpRequestBase 对象。

Request.UserHostAddress

您可以获得客户端的 IP 地址。

【讨论】:

    【解决方案2】:

    你可以使用这个函数来获取ip地址。

        private string GetUserIP()
        {
            string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    
            if (!string.IsNullOrEmpty(ipList))
            {
    
                var ips= ipList.Split(',');
                return ips[ips.Length - 1];
            }
    
            return Request.ServerVariables["REMOTE_ADDR"];
        }
    

    注意:HTTP_X_FORWARDED_FOR 标头可能有多个 IP。正确的 IP 是最后一个。

    【讨论】:

    • 使用 HTTP_X_FORWARDED_FOR 始终返回一个空字符串。 REMOTE_ADDR 返回生产服务器的错误 IP 地址。
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 2013-07-07
    • 2011-05-26
    • 2015-03-01
    • 2011-01-08
    • 2014-12-29
    • 2012-03-14
    • 2016-01-26
    相关资源
    最近更新 更多