Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取IP地址?_C#_.net_Asp.net - Fatal编程技术网

C# 如何获取IP地址?

C# 如何获取IP地址?,c#,.net,asp.net,C#,.net,Asp.net,我想得到的ip地址谁是在我的网站注册。如何在ASPNET中执行此操作。我使用了下面的代码,但是,它没有得到正确的IP地址 string ipaddress = Request.UserHostAddress; 您可以使用此方法获取客户端计算机的IP地址 public static String GetIP() { String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"

我想得到的ip地址谁是在我的网站注册。如何在ASPNET中执行此操作。我使用了下面的代码,但是,它没有得到正确的IP地址

string ipaddress = Request.UserHostAddress;

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

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

Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
如果无法通过这种方式获得IP,则返回null或“未知”

Request.ServerVariables[“REMOTE\u ADDR”]
应与
Request.UserHostAddress
相同,如果请求不是来自非匿名代理,则可以使用这两种方法


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

应该使用HTTP\u X\u FORWARDED\u 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;
}

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

如果您在web服务器和设置标头的客户端之间使用代理,则应该能够信任最后一个地址。然后使用Muhammed建议的代码进行更新,以始终从转发头获取最后一个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;
}

这更全面地解释了风险。

在MVC 6中,您可以通过以下方式检索IP地址:

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"];
    }
HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString()

我会小心的,你选择的第一个项目可能是192.168.x.x。您通常希望获取最后一个,因为它是连接到您的系统的最后一个代理或客户端(可能是最可靠的源)。请参阅我使用的代码:ip=(HttpContext.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”]???”).Split(“,”).Last().Trim()@WouterSimons,根据相同的“最左边是原始客户机”,因此应该使用First()而不是Last()1。2.拆分HTTP_X_FORWARDED_FOR可能重复,选择last更好-请参阅答案
X-FORWARDED-FOR
可以包含多个IP地址。请为代码添加说明(并改进缩进)。这将提高您答案的质量!您从未使用过
le
变量-我想您应该在下一行中使用该变量,而不是
0
。Last()需要System.Linq,以防无法编译该代码