首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET中获取用户的客户端IP地址?

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

Stack Overflow用户
提问于 2009-04-09 18:19:27
回答 21查看 658.4K关注 0票数 409

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

例如,在堆栈溢出用户配置文件中是:“最后一个帐户活动:4小时前来自86.123.127.8",但我的机器IP地址有点不同。Stack Overflow是如何获得此地址的?

在某些web系统中,存在用于某些目的的IP地址检查。例如,对于特定的IP地址,用户每24小时只能点击5次下载链接吗?此IP地址应该是唯一的,而不适用于拥有大量客户端或Internet用户的ISP。

我理解得很好吗?

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2009-04-09 18:37:15

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

例如。

  • 您是否正在尝试唯一标识您的用户?
  • 您是否可以使用cookie或会话ID而不是IP地址?

你在服务器上看到的地址不应该是的地址,正如你所说的,这将是一个很大的范围。宽带家庭用户的地址将是其路由器的地址,因此房屋内的每台设备在外观上看起来都是相同的,但路由器使用NAT来确保流量正确路由到每台设备。对于从办公环境访问的用户,所有用户的地址可能都是相同的。使用IP地址作为ID的站点会冒着非常错误的风险--你给出的例子都很好,而且经常失败。例如,我的办公室在英国,突破点(我“看起来”在互联网上)是在另一个国家,我们的主要IT设施在那里,所以从我的办公室来看,我的IP地址似乎不在英国。由于这个原因,我不能只访问英国的网络内容,如BBC iPlayer)。在任何时候,我的公司都会有成百上千的人似乎从同一个IP地址访问网络。

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

当您说您的计算机地址与StackOverflow上显示的IP地址不同时,您如何找到您的计算机地址?如果你只是在本地使用ipconfig或类似的东西,我希望它会因为我上面概述的原因而有所不同。如果你想仔细看看外界的想法,那就看看whatismyipaddress.com/吧。

这篇Wikipedia link on NAT将为你提供一些背景知识。

票数 147
EN

Stack Overflow用户

发布于 2009-04-11 17:03:57

通常你会想知道访问你网站的人的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's blog post "Gotcha: HTTP_X_FORWARDED_FOR returns multiple IP addresses"

C#

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 478
EN

Stack Overflow用户

发布于 2012-03-05 21:27:50

更新:感谢布鲁诺·洛佩斯。如果可能出现多个ip地址,则需要使用此方法:

代码语言:javascript
复制
    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }
票数 86
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/735350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档