2010-04-12 3 views

ответ

20

HttpContext.Current.Request.UserHostAddress;

или

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

или

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

+3

что такое отличаются между двумя первыми альтернативами? –

25

Редактировать: также нашел интересный вопрос относительно заголовков http-связанных http here.

Редакция 2: Как указано в комментариях и в ссылке, приведенной выше, заголовок HTTP_X_FORWARDED_FOR может содержать несколько IP-адресов, разделенных запятой. Я не сталкивался с этой ситуацией, но предполагаю, что некоторые поправки к моему ответу требуются.

Я использую этот код, чтобы получить IP-адрес (он возвращает IPAddress.None значение, если получение не удалось по каким-то причинам):

/// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// The <see cref="System.Net.IPAddress.None" /> value will be returned if getting is failed. 
    /// </remarks> 
    /// </summary> 
    /// <param name="request">The HTTP request object.</param> 
    /// <returns></returns> 
    public static IPAddress GetIp(this HttpRequest request) 
    { 
     string ipString; 
     if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
     { 
      ipString = request.ServerVariables["REMOTE_ADDR"]; 
     } 
     else 
     { 
      ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
       .FirstOrDefault(); 
     } 

     IPAddress result; 
     if (!IPAddress.TryParse(ipString, out result)) 
     { 
      result = IPAddress.None; 
     } 

     return result; 
    } 
+7

+1 для возврата в качестве объекта IPAddress –

+4

Имейте в виду, что заголовок 'X-Forwarded-For' может быть подделан, поэтому не принимайте на него никаких решений безопасности. Проверяйте значение «HTTP_X_FORWARDED_FOR» только в том случае, если машина находится за балансировщиком нагрузки или обратным прокси. – devstuff

+2

Также имейте в виду, что HTTP_X_FORWARDED_FOR будет содержать несколько IP-адресов, если передано несколько прокси. Правильно ли используется метод Parse? – Tomas

1
public String GetIP() 
{ 
    string ipString; 
    if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
    { 
     ipString = Request.ServerVariables["REMOTE_ADDR"]; 
    } 
    else 
    { 
     ipString = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
    } 
    return ipString; 
} 

Первый пытается выяснить прокси IP, если его нуль, мы можем получить что система IP

0

Попробуйте получить внешний IP-адрес пользователя ..

public static string getExternalIp() 
    { 
     try 
     { 

      string externalIP; 
      externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/"); 
      externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) 
         .Matches(externalIP)[0].ToString(); 
      return externalIP; 
     } 
     catch { return null; } 
    } 
Смежные вопросы