如何在ASP.NET中获取用户的客户端IP地址?

17 浏览
0 Comments

如何在ASP.NET中获取用户的客户端IP地址?

我们可以使用 Request.UserHostAddress 来在 ASP.NET 中获取 IP 地址,但这通常是用户的 ISP 的 IP 地址,而不是用户机器的 IP 地址,例如点击了一个链接的用户。我该如何获取真实的 IP 地址?

例如,在 Stack Overflow 用户个人资料中,它是这样的:\"最近活动:4 小时前来自 86.123.127.8 的访问\",但我的机器 IP 地址稍有不同。Stack Overflow 是如何获取这个地址的?

在一些网络系统中,有一个 IP 地址检查用于某些目的。例如,使用特定的 IP 地址,每 24 小时用户只能下载链接 5 次?这个 IP 地址应该是唯一的,而不是一个拥有巨大用户范围的 ISP 或互联网用户的 IP 地址。

我理解得对吗?

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

正如其他人所说,你不能做你所询问的事情。如果你描述一下你正在尝试解决的问题,也许有人能帮助你?

例如:

  • 你是在尝试唯一标识你的用户吗?
  • 你是否可以使用Cookie或会话ID代替IP地址?

编辑你在服务器上看到的地址不应该是ISP的地址,正如你所说,那将是一个巨大的范围。在宽带家庭用户的情况下,地址将是其路由器上的地址,因此房子内的每个设备在外部看起来都是一样的,但路由器使用NAT以确保将流量正确路由到每个设备。对于从办公环境访问的用户,地址可能是所有用户的相同。使用IP地址作为标识的网站有可能出现严重错误-你所给出的例子很好,但它们往往会失败。例如,我的办公室位于英国,断点(我"出现"在互联网上的地方)位于另一个我们主要IT设施所在的国家,因此从我的办公室,我的IP地址似乎不在英国。因此,我无法访问英国专属的网络内容,例如BBC iPlayer。在任何给定时刻,我公司可能会有数百甚至上千名用户看起来从同一个IP地址访问网络。

当你编写服务器代码时,你永远无法确定你所看到的IP地址是什么。有些用户喜欢这样。有些人故意使用代理或VPN来进一步混淆你。

当你说你的机器地址与StackOverflow显示的IP地址不同时,你是如何找出你的机器地址的?如果你只是本地查找,使用ipconfig或类似的工具,我希望它出于我上面所阐述的原因而不同。如果你想要双重检查外部世界的看法,请看一看whatismyipaddress.com/

这个Wikipedia链接关于NAT会为您提供一些相关背景。

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