2010-04-12 29 views

Odpowiedz

20

HttpContext.Current.Request.UserHostAddress;

lub

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

lub

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

+3

Jaki jest różnią między dwiema pierwszymi alternatywami? –

2

Request.UserHostAddress

25

Edytuj: również znalazł interesujące pytanie dotyczące nagłówków HTTP związanych z adresem IP: here.

Edit2: Jak wspomniano w komentarzach, a ja w linku powyżej pod warunkiem, HTTP_X_FORWARDED_FOR nagłówek może zawierać wiele adresów IP oddzielonych przecinkiem. Nie stanąłem twarzą w twarz z tą sytuacją, ale przypuśćmy, że wymagane są pewne poprawki w mojej odpowiedzi.

używam tego kodu, aby uzyskać adres IP (zwraca IPAddress.None wartość, jeśli coraz powiodło się z jakiegoś powodu):

/// <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 za zwrócenie jako IPAddress obiektu –

+4

Należy pamiętać, że nagłówek 'X-Forwarded-For' może być sfałszowany, więc nie podejmuj żadnych decyzji bezpieczeństwa na jego podstawie. Sprawdź tylko wartość 'HTTP_X_FORWARDED_FOR', jeśli maszyna znajduje się za równoważnikiem obciążenia lub odwrotnym proxy. – devstuff

+2

Należy również pamiętać, że HTTP_X_FORWARDED_FOR będzie zawierać wiele adresów IP, jeśli zostanie przekazanych wiele serwerów proxy. Czy metoda Parse obsługuje to poprawnie? – 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; 
} 

Najpierw próbuje dowiedzieć proxy IP, jeśli jego wartość null możemy uzyskać że IP System

0

Spróbuj dostać zewnętrznego adresu IP użytkownika ..

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; } 
    } 
Powiązane problemy