如何在ASP.NET中获取用户的客户端IP地址?
如何在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 地址。
我理解得对吗?
正如其他人所说,你不能做你所询问的事情。如果你描述一下你正在尝试解决的问题,也许有人能帮助你?
例如:
- 你是在尝试唯一标识你的用户吗?
- 你是否可以使用Cookie或会话ID代替IP地址?
编辑你在服务器上看到的地址不应该是ISP的地址,正如你所说,那将是一个巨大的范围。在宽带家庭用户的情况下,地址将是其路由器上的地址,因此房子内的每个设备在外部看起来都是一样的,但路由器使用NAT以确保将流量正确路由到每个设备。对于从办公环境访问的用户,地址可能是所有用户的相同。使用IP地址作为标识的网站有可能出现严重错误-你所给出的例子很好,但它们往往会失败。例如,我的办公室位于英国,断点(我"出现"在互联网上的地方)位于另一个我们主要IT设施所在的国家,因此从我的办公室,我的IP地址似乎不在英国。因此,我无法访问英国专属的网络内容,例如BBC iPlayer。在任何给定时刻,我公司可能会有数百甚至上千名用户看起来从同一个IP地址访问网络。
当你编写服务器代码时,你永远无法确定你所看到的IP地址是什么。有些用户喜欢这样。有些人故意使用代理或VPN来进一步混淆你。
当你说你的机器地址与StackOverflow显示的IP地址不同时,你是如何找出你的机器地址的?如果你只是本地查找,使用ipconfig
或类似的工具,我希望它出于我上面所阐述的原因而不同。如果你想要双重检查外部世界的看法,请看一看whatismyipaddress.com/。
这个Wikipedia链接关于NAT会为您提供一些相关背景。
通常您会想知道访问您网站的人的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