当应用程序在IIS中发布时获取本地计算机的IP
当应用程序在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或互联网用户。
我理解得正确吗?
正如其他人所说,您不能做您想要的事情。如果您描述要解决的问题,或许可以得到帮助?
例如:
- 您是在试图唯一标识您的用户吗?
- 您能否使用 cookie 或会话 ID,而不是 IP 地址?
编辑 您在服务器上看到的地址不应该是 ISP 的地址,因为那将是一个很大的范围。在宽带家庭用户的情况下,路由器上的地址将是其地址,因此,房子内的每个设备都会在外部看起来是相同的,但路由器使用网络地址转换(NAT)确保流量被正确地路由到每个设备。对于从办公环境访问的用户,其地址可能对所有用户都是相同的。使用 IP 地址作为标识的网站存在严重错误的风险 - 您所举的例子是好的,但它们经常失败。例如,我的办公室在英国,我们的主要 IT 设施所在的出口点(我“出现”在互联网上的地方)在另一个国家,因此从我的办公室,我的 IP 地址似乎不在英国。因此,我无法访问英国境内的网络内容,例如 BBC iPlayer)。任何时候,在我的公司可能有数百或甚至数千人似乎在使用相同的 IP 地址访问网络。
当您编写服务器代码时,您永远不能确定您看到的 IP 地址是指什么。有些用户喜欢这种方式,有些人故意使用代理或 VPN 来让您更加困惑。
当您说您的机器地址与 Stack Overflow 上显示的 IP 地址不同时,您是如何找到您的机器地址的?如果您只是在本地查看使用 ipconfig
或类似工具,我会因为我所概述的原因而期望其是不同的。如果您想要双重检查外部世界所认为的,请看一看 whatismyipaddress.com/。
这个Wikipedia 上的 NAT 链接将为您提供一些背景知识。
通常情况下,您会想知道访问您网站的某人的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_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