获取调用者IP地址
获取调用者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地址作为ID的网站有可能犯大错 - 你所举的例子很好,但他们经常失败。例如,我的办公室在英国,在另一个国家我们的主要IT设施的旁路点(我“出现”在互联网上的位置)上,所以从我的办公室看,我的IP地址似乎不在英国。因此,我无法访问只在英国的网络内容,如BBC iPlayer。在任何给定时间,我的公司可能有数百甚至数千人在使用相同的IP地址访问互联网。
当你编写服务器代码时,你永远不知道你所看到的IP地址指的到底是什么。有些用户喜欢这种情况。有些人故意使用代理或VPN来让您更糊涂。
当你说你的机器地址与StackOverflow上显示的IP地址不同,你是如何找到你的机器地址的?如果你只是本地使用ipconfig
或类似软件来查看,我期望它会因我上面介绍的原因而不同。如果你想要验证外面的世界认为是什么,请参考whatismyipaddress.com/。
这个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_FORWARD_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