2009-12-15 275 views
45

我想获得在我的网站注册的任何IP地址。如何在ASPNET中做到这一点。我用下面的代码,但是,它没有得到正确的IP地址如何获取IP地址?

string ipaddress = Request.UserHostAddress; 
+0

1 http://www.w3schools.com/asp/coll_servervariables.asp](http://www .w3schools.com/asp/coll_servervariables.asp)2. [http://balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/](http:// balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/) – solairaja 2009-12-15 12:50:02

+1

[如何在ASP.NET中获取用户的客户IP地址?](http:/ /stackoverflow.com/questions/735350/how-to-get-a-users-client-ip-address-in-asp-net) – 2015-06-10 17:54:28

回答

54

您可以使用此方法来获取客户机的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; 
} 
+1

拆分HTTP_X_FORWARDED_FOR并选择最后一个更好 - 查看答案http://stackoverflow.com/a/13249280/52277 – 2014-05-01 05:08:10

+2

'X-Forwarded-For'可以包含多个IP地址。 – Gabriel 2014-11-03 00:50:39

3

如果一个客户端连接,通过透明的非匿名代理,你可以从他们的地址:

Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 

可以返回null或“未知”如果无法获得IP那样。

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

但是,如果请求来自匿名代理,则无法直接获取客户端的IP。这就是为什么他们称这些代理匿名

34

应该使用HTTP_X_FORWARDED_FOR,但它可以返回多个由逗号分隔的IP地址。见this page

所以你应该经常检查它。我个人使用分割功能。

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; 
} 
+17

我会小心的,你选择的第一个项目可能是192.168.x.x.您通常希望获得最后一个,因为那是连接到您的系统的最后一个代理或客户端(可能是最可靠的来源)。见[维基百科文章](http://en.wikipedia.org/wiki/X-Forwarded-For)我使用的代码是这样的:'ip =(HttpContext.Request.ServerVariables [“HTTP_X_FORWARDED_FOR”] ??“” ).Split(',')。Last()。Trim();' – 2012-11-06 10:30:19

+4

@WouterSimons,根据[Wikipedia article](https://en.wikipedia.org/wiki/X-Forwarded-For)“最左边的是原始客户端“,所以应该使用First()而不是Last() – 2015-11-25 06:36:01

33

在您使用IP地址进行安全保护的情况下,您应该了解您的基础设施。

如果您在Web服务器和设置标头的客户端之间使用代理,则应该可以信任最后一个地址。然后你使用像穆罕默德建议的更新代码,总是从转发头获得最后一个IP地址(见下面的代码)

如果你不使用代理,请注意X-Forwarded-For头是非常容易欺骗。我建议你忽略它,除非你有明确的理由不这样做。

我更新穆罕默德·阿赫塔尔的代码如下,让你选择:

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; 
} 

Wikipedia article更全面地说明了风险。

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"]; 
    } 
+0

请向您的代码添加解释(并改进缩进)。这会提高你的答案的质量! – 2016-12-02 12:20:23

+0

你永远不会使用'le'变量 - 我想你想在下一行使用那个而不是'0' – 2016-12-02 12:36:29

4

在MVC 6,您检索IP地址这种方式:

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