Request.UserHostAddress返回Load Balancer的IP地址

Sac*_*nth 6 c# load-balancing request

我的网站中有一个关键的代码行,它在我们的开发环境中工作,但不适用于生产.好吧,我说它在开发中有效但事实是它给出了::1,这是IPv6环回地址.

无论如何,我想要做的是捕获访问该站点的用户的IP地址.因此,我曾经Request.UserHostAddress这样做过.在开发方面,正如我所说,它给了我回送地址,这是正确的,因为我从我的机器运行该站点.在现场它做了一些完全不同的事情.它总是返回负载均衡器的地址.

我想要了解的是这一点.使用Request.UserHostAddress来捕获用户的IP地址或者我们的网络设置有什么问题或者其他什么我错了吗?

谢谢,

萨钦

Dam*_*ver 9

在您自己的应用程序中,如果没有其他任何方法可以帮助您,那么您就会陷入困境.这是您可以获得的尽可能多的信息.

如果您很幸运,您的负载均衡器已配置为添加一个或多个额外标头,其中包含有关原始请求的信息.

一个常见的解决方案是X-Forwarded-For标题:

X-Forwarded-For(XFF)HTTP头字段是用于识别通过HTTP代理或负载平衡器连接到Web服务器的客户端的原始IP地址的事实标准.

然后您将通过Request.Headers酒店进入.

但是,发现这个(或另一个)标头是否可用并不是我们可以帮助的 - 您需要与为您的组织配置负载均衡器的人员交谈.


Shi*_*mmy 6

参考@Damien_The_Unbeliever回答,这里是完整的解决方案:

public static string GetIpAddress()
{
  var request = HttpContext.Current.Request;
  // Look for a proxy address first
  var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];

  // If there is no proxy, get the standard remote address
  if (string.IsNullOrWhiteSpace(ip)
      || string.Equals(ip, "unknown", StringComparison.OrdinalIgnoreCase))
    ip = request.ServerVariables["REMOTE_ADDR"];
  else
  {
    //extract first IP
    var index = ip.IndexOf(',');
    if (index > 0)
      ip = ip.Substring(0, index);

    //remove port
    index = ip.IndexOf(':');
    if (index > 0)
      ip = ip.Substring(0, index);
  }

  return ip;
}
Run Code Online (Sandbox Code Playgroud)