【问题标题】:Client IP address returns the same internal network address客户端 IP 地址返回相同的内部网络地址
【发布时间】:2017-12-14 16:41:12
【问题描述】:

我正在尝试从 ASP.NET MVC 5 获取用户的 IP 地址。我查找了各种示例,例如:

它们都产生了相同的结果:用户被认为是网络内部的。我有朋友尝试过他们的手机(不在网络上)。这是我最近的尝试:

private static Logger _logger = LogManager.GetCurrentClassLogger();
public static bool IsIpInternal()
{
    var ipAddress = HttpContext.Current.Request.UserHostAddress;
    var logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, ipAddress);
    _logger.Log(logEvent);
    try
    {
        if (ipAddress != null)
        {
            var ipParts = ipAddress.Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse).ToArray();
            var isDebug = System.Diagnostics.Debugger.IsAttached;

            if (ipParts[0] == 10)
            {
                return true;
            }
        }
    }
    catch (Exception e)
    {
        logEvent = new LogEventInfo(LogLevel.Error, _logger.Name, e.Message);
        _logger.Log(logEvent);
        return false;
    }
    return false;
}

日志显示所有请求的10.xxx.xx.xxx(基于日志)。这是一个内部地址,而不是连接到 Web 应用程序的客户端的 IP。 IsIpInternal() 总是返回 true。我做错了什么?

请注意,我忽略了 192.168.x.x172.16.xxx.xxx 地址作为内部地址。

【问题讨论】:

  • 您的网站是否在代理或负载平衡器后面?
  • @JohnWu,是的,我们有一个我们所有服务器都使用的 Citrix NetScaler。会不会是删除了原来的 IP 地址?

标签: c# asp.net-mvc


【解决方案1】:

如果您的网站位于负载均衡器后面,那么当您期望客户端的 IP 地址时出现负载均衡器的 IP 地址是一个常见问题。那是因为实际上负载均衡器是 Web 应用程序知道与之对话的唯一客户端。

有两种方法可以解决这个问题:

  1. 您可以配置负载平衡器以添加额外的 HTTP 标头 (x-forwarded-for),以指定原始 IP 地址。您需要修改您的网站以查看此标头而不是 UserHostAddress,如下所示:

    //var clientIP = HttpContext.Current.Request.UserHostAddress;
    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"];
    

    注意:在某些情况下,x-forwarded-for 标头实际上可以return a comma-delimited list of IP addresses。所以为了适应这种情况,你可以这样写:

    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"].Split(',')[0];
    
  2. 您可以通过复制IP头数据包来配置某些LB通过客户端IP。对于 Citrix Netscaler,请参阅 this article 了解更多信息。

【讨论】:

  • 谢谢,@JohnWu。系统管理员在 Netscaler 中添加了标头,现在它就像一个魅力!
  • 太棒了!感谢您确认它有效。我们通常做选项#1。
  • 是的,使用该选项并通过HttpContext.Current.Request.Headers["x-forwarded-for"]阅读它
猜你喜欢
  • 2020-04-06
  • 2011-10-25
  • 1970-01-01
  • 2015-01-29
  • 2011-10-04
  • 1970-01-01
  • 2014-12-08
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多