Request.UserHostAddress возвращает IP-адрес балансировщика нагрузки

У меня на сайте есть критическая строка кода, которая работала в нашей среде разработки, но не в продакшене. Ну, я говорю, что он работал в разработке, но на самом деле он дал ::1, который является адресом обратной связи IPv6.

В любом случае, я хотел захватить IP-адрес пользователя, который зашел на сайт. Поэтому я использовал Request.UserHostAddress для этого. При разработке, как я уже сказал, он дал мне адрес обратной связи, что является правильным, поскольку я запускал сайт со своей машины. В прямом эфире это было совсем другое. Он всегда возвращал адрес балансировщика нагрузки.

Я пытаюсь понять вот что. Я ошибался, используя Request.UserHostAddress для захвата IP-адреса пользователя, или что-то не так с настройкой нашей сети или что-то еще?

Спасибо,

Сачин


person Sachin Kainth    schedule 08.03.2013    source источник


Ответы (3)


Если в вашем собственном приложении не было сделано ничего, чтобы помочь вам, вы застряли. Это столько информации, сколько вам доступно.

Если вам повезло, ваш балансировщик нагрузки был настроен на добавление одного или нескольких дополнительных заголовков с информацией об исходном запросе.

Одним из распространенных решений является заголовок X-Forwarded-For:

Поле HTTP-заголовка X-Forwarded-For (XFF) является фактическим стандартом для определения исходного IP-адреса клиента, подключающегося к веб-серверу через HTTP-прокси или балансировщик нагрузки.

к которому вы затем получите доступ через свойство Request.Headers.

Но выяснить, доступен ли этот (или другой) заголовок, мы не можем помочь - вам нужно поговорить с людьми, которые настроили балансировщик нагрузки для вашей организации.

person Damien_The_Unbeliever    schedule 08.03.2013

Что касается @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;
}
person Shimmy Weitzhandler    schedule 20.04.2015
comment
если перенаправленный адрес содержит более одного адреса, то как мы можем определить правильный? - person It's a trap; 28.09.2016
comment
@ Itatrap, когда есть несколько IP-адресов, первый определяет адрес клиента, остальные - адреса прокси. Обычно это похоже на следующие client1, proxy1, proxy2. - person To Ka; 27.06.2017

Использовал этот код для проверки производственной среды ... У меня это сработало:

    System.Web.HttpRequest oRequest = System.Web.HttpContext.Current.Request;

    string header;
    string ip;

    header = "HTTP_X_FORWARDED_FOR";
    ip = oRequest.ServerVariables[header];
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);

    header = "REMOTE_ADDR";
    ip = oRequest.ServerVariables[header];
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);

    header = "HTTP_CLIENT_IP";
    ip = oRequest.ServerVariables[header];
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);

    header = "Request.UserHostAddress";
    ip = oRequest.UserHostAddress;
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);
person E. Pessini    schedule 09.03.2017
comment
Можете ли вы добавить объяснение того, что именно это делает, а не просто дамп кода? - person Necoras; 09.03.2017
comment
Когда я сказал, что использовал этот код для проверки производственной среды, я имел в виду, что есть несколько способов получить IP-адрес клиента, но с небольшими различиями между собой. Что я сделал, так это распечатал все переменные, чтобы убедиться, что одна из них верна, и, на самом деле, HTTP_X_FORWARDED_FOR у меня работал нормально! - person E. Pessini; 07.03.2018
comment
Просто чтобы добавить к предложению OP, создайте страницу на своем веб-сайте, например IP.aspx, и поместите это выше - person Iomm1; 17.07.2018
comment
... [продолжение] код OP ‹% @ Page Language = C #%› Под закрытием OP% ›add‹ head runat = server ›‹title› ‹/title› ‹/head› ‹body›‹ form id = form1 runat = server ›‹div› ‹/div› ‹/form› ‹/body› ‹/html›, затем вызовите страницу IP.aspx, она отобразит различные заголовки запроса. Если какой-либо из них даст вам нужный ответ, тогда используйте его. В моем окружении это был HTTP_CLIENT_IP - person Iomm1; 17.07.2018