ASP.net / VB.net获取客户端的IP地址

6 浏览
0 Comments

ASP.net / VB.net获取客户端的IP地址

在ASP.NET中,我们有Request.UserHostAddress可以获取IP地址,但通常这是用户的ISP的IP地址,而不是例如点击链接的用户机器的IP地址。我该如何获取真实的IP地址?例如,在Stack Overflow用户资料中是:“最后活动时间:4小时以前,来自86.123.127.8”,但我的机器IP地址略有不同。Stack Overflow是如何获取这个地址的呢?在某些Web系统中,会对IP地址进行检查,例如,在特定IP地址下,用户在每24小时内只能有5次下载链接的点击?这个IP地址应该是唯一的,而不是一个有大量客户或互联网用户的ISP的IP地址。我理解得对吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

正如其他人所说,你无法做到你所要求的。如果你描述一下你试图解决的问题,也许有人可以帮你解决?

例如:

  • 你想要唯一地识别你的用户吗?
  • 你是否可以使用Cookie或会话ID,而不是IP地址?

编辑:你在服务器上看到的地址不应该是ISP的地址,正如你所说,那将是一个巨大的范围。在宽带家庭用户的情况下,路由器上的地址将是他们的地址,因此,房子里面的每个设备在外面看起来都一样,但路由器使用NAT来确保流量被正确地路由到每个设备。对于从办公环境访问的用户,地址可能是所有用户都相同的。使用IP地址进行ID识别的网站存在获取错误信息的风险-你提供的例子是好的,但它们经常失败。例如,我的办公室在英国,出口点(我“出现”在互联网上的地方)位于我们的主要IT设施所在的另一个国家,因此从我的办公室出发,我的IP地址似乎不在英国。因此,我无法访问仅限于英国的网络内容,例如BBC iPlayer。在任何给定的时间,我的公司可能会有数百,甚至数千人看起来从同一个IP地址访问网络。

在编写服务器代码时,您永远无法确定您所看到的IP地址是指什么。有些用户喜欢这种方式。有些人故意使用代理或VPN来进一步困扰您。

当你说你的机器地址与StackOverflow上显示的IP地址不同时,你是如何找出你的机器地址的?如果你只是使用ipconfig等本地查看,我会期望它会因上面列出的原因而有所不同。如果你想要双重检查外部世界的想法,请查看whatismyipaddress.com/

这个Wikipedia链接将为您提供一些背景信息。

0
0 Comments

通常您会想要知道访问您网站的人的IP地址。虽然ASP.NET有几种方法可以实现这一点,但我们看到最好的方法之一是使用ServerVariables集合的"HTTP_X_FORWARDED_FOR"。

原因如下...

有时您的访问者可能在代理服务器或路由器后面,而标准的Request.UserHostAddress只捕获代理服务器或路由器的IP地址。当这种情况发生时,用户的IP地址将存储在服务器变量("HTTP_X_FORWARDED_FOR")中。

所以我们要做的第一件事是检查"HTTP_X_FORWARDED_FOR",如果为空,我们就简单地返回ServerVariables("REMOTE_ADDR")

虽然这种方法并不是万无一失的,但它可以带来更好的结果。下面是VB.NET的ASP.NET代码,摘自James Crowley的博客文章"Gotcha: HTTP_X_FORWARDed_FOR返回多个IP地址"

C#

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current; 
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }
    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function

0