2013-03-08 2 views
4

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

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

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

Спасибо,

Сэчин

ответ

8

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

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

Одним общим решением является X-Forwarded-For заголовка:

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

, который вы получили бы через недвижимость Request.Headers.

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

2

В связи с @Damien_The_Unbeliever «s answer, вот полное решение:

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; 
} 
+0

если пересылается адрес содержит более одного адреса, то как мы можем определить правильный? –

+0

@ It'satrap при наличии нескольких IP-адресов, первый определяет адрес клиента, остальные - прокси-адреса. Он обычно похож на следующий клиент1, proxy1, proxy2. –

-1

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

<% 

       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); 

      %> 
+1

Можете ли вы добавить некоторое объяснение того, что именно это делает, а не просто сброс кода? – Necoras

+0

Когда я сказал, что «Используется этот код для проверки производственной среды», я имею в виду, что есть несколько способов получить клиентский IP-адрес, но с небольшими различиями между собой. То, что я сделал, - это распечатать все переменные, чтобы проверить, что один из них правильный, и, по сути, HTTP_X_FORWARDED_FOR отлично справился со мной! –

Смежные вопросы