当应用程序在IIS中发布时获取本地计算机的IP

15 浏览
0 Comments

当应用程序在IIS中发布时获取本地计算机的IP

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

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

在一些Web系统中,有些目的需要检查IP地址。例如,对于某个IP地址,用户每24小时只能有5次下载链接的点击?这个IP地址应该是唯一的,而不是一个有庞大客户群的ISP或互联网用户。

我理解得正确吗?

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

正如其他人所说,您不能做您想要的事情。如果您描述要解决的问题,或许可以得到帮助?

例如:

  • 您是在试图唯一标识您的用户吗?
  • 您能否使用 cookie 或会话 ID,而不是 IP 地址?

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

当您编写服务器代码时,您永远不能确定您看到的 IP 地址是指什么。有些用户喜欢这种方式,有些人故意使用代理或 VPN 来让您更加困惑。

当您说您的机器地址与 Stack Overflow 上显示的 IP 地址不同时,您是如何找到您的机器地址的?如果您只是在本地查看使用 ipconfig 或类似工具,我会因为我所概述的原因而期望其是不同的。如果您想要双重检查外部世界所认为的,请看一看 whatismyipaddress.com/

这个Wikipedia 上的 NAT 链接将为您提供一些背景知识。

0
0 Comments

通常情况下,您会想知道访问您网站的某人的IP地址。虽然ASP.NET有多种方法可以实现这一点,但我们看到的最好的方法之一是使用服务器变量集合中的“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_FORWARD​ED_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