如何获取IP地址?

59
我想获取在我的网站上注册的人的IP地址。如何在ASP.NET中实现这一点。我使用了以下代码,但它没有得到正确的IP地址。
string ipaddress = Request.UserHostAddress;

  1. http://www.w3schools.com/asp/coll_servervariables.asp
  2. http://balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/
- solairaja
1
可能是重复的问题:如何在ASP.NET中获取用户客户端IP地址? - Jon Schneider
6个回答

76
您可以使用这种方法获取客户机的IP地址。
public static String GetIP()
{
    String ip = 
        HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (string.IsNullOrEmpty(ip))
    {
        ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    }

    return ip;
}

3
拆分HTTP_X_FORWARDED_FOR并选择最后一个更好-请参见答案https://dev59.com/knI-5IYBdhLWcg3wVWzv#13249280 - Michael Freidgeim
8
X-Forwarded-For 可以包含多个 IP 地址。 - Gabriel

45
在使用IP地址作为安全措施的情况下,您应该了解自己的基础设施。
如果您在Web服务器和客户端之间使用代理来设置头文件,那么您应该能够信任最后一个地址。然后您可以使用像Muhammed建议的代码并更新以始终从前向头文件中获取最后一个IP地址(请参见以下代码)。
如果您不使用代理,请注意X-Forwarded-For头很容易被伪造。我建议您忽略它,除非您有明确的原因不这样做。
我根据需要更新了Muhammed Akhtar的代码,如下所示:
public string GetIP(bool CheckForward = false)
{
    string ip = null;
    if (CheckForward) {
        ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    }

    if (string.IsNullOrEmpty(ip)) {
        ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    } else { // Using X-Forwarded-For last address
        ip = ip.Split(',')
               .Last()
               .Trim();
    }

    return ip;
}

这篇维基百科文章更详细地解释了相关风险。


1
如果您无法编译该代码,则需要使用System.Linq来调用数组Last()函数。 - sandwood
在逗号分隔后,它应该获取数组中的First()值。 - smurtagh

36

应该使用HTTP_X_FORWARDED_FOR,但它可能返回用逗号分隔的多个IP地址。请参见此页面

因此,您应该始终检查它。我个人使用Split函数。

public static String GetIPAddress()
{
    String ip = 
        HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (string.IsNullOrEmpty(ip))
        ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    else
        ip = ip.Split(',')[0];

    return ip;
}

18
我会小心处理这个,你正在选择可能是192.168.x.x的第一项。通常你想获取最后一项,因为那是连接到你系统的最后一个代理或客户端(也是最可靠的来源)。请参见wikipedia文章,我使用的代码就像这样:ip = (HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? "").Split(',').Last().Trim(); - Wouter Simons
4
根据同一篇Wikipedia文章,最左边的IP地址是原始客户端的地址,因此应该使用First()而不是Last()函数。 - Michael Freidgeim

21

在MVC 6中,您可以使用以下方式获取IP地址:

HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString()

3
你已经拥有Context,为什么还要去请求获取它?这可以简单地写成HttpContext.Connection.RemoteIpAddress.ToString() - Serj Sagan

3

如果客户端通过透明非匿名代理连接,则可以从以下位置获取其地址:

Request.ServerVariables["HTTP_X_FORWARDED_FOR"]

如果通过该方法无法获取IP,会返回null或"unknown"。

Request.ServerVariables["REMOTE_ADDR"]Request.UserHostAddress应该是相同的,如果请求不来自非匿名代理,则可以使用其中任何一个。

然而,如果请求来自匿名代理,那么直接获取客户端IP就不可能了。这就是为什么它们称这些代理为匿名代理。


0
string result = string.Empty;
    string ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ip))
    {
        string[] ipRange = ip.Split(',');
        int le = ipRange.Length - 1;
        result = ipRange[0];
    }
    else
    {
        result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    }

请在您的代码中添加解释(并改善缩进)。这将提高您的答案质量! - Nander Speerstra
你从未使用过那个 le 变量 - 我猜你想在下一行中使用它而不是 0 - Hans Kesting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接