2010-04-12 5 views

Antwort

20

HttpContext.Current.Request.UserHostAddress;

oder

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

oder

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

+3

Was ist das abweichen zwischen den beiden ersten Alternativen? –

2

Request.UserHostAddress

25

Edit: fand auch eine interessante Frage in Bezug auf IP-verwandte HTTP-Header here.

Edit2: Wie in den Kommentaren erwähnt und in Verbindung bereitgestellt I oben kann HTTP_X_FORWARDED_FOR Header mehrere IP-Adressen durch Komma getrennt enthalten. Ich war nicht mit dieser Situation konfrontiert, nehme aber an, dass einige Korrekturen meiner Antwort erforderlich sind.

ich diesen Code verwenden, um die IP-Adresse zu erhalten (es gibt IPAddress.None Wert, wenn aus irgendeinem Grund fehlgeschlagen bekommen):

/// <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 für die Rückgabe als IPAddress-Objekt –

+4

Beachten Sie, dass der Header 'X-Forwarded-For' gefälscht werden kann. Treffen Sie daher keine Sicherheitsentscheidungen. Überprüfen Sie den Wert "HTTP_X_FORWARDED_FOR" nur, wenn sich die Maschine hinter einem Load Balancer oder Reverseproxy befindet. – devstuff

+2

Beachten Sie außerdem, dass HTTP_X_FORWARDED_FOR mehrere IP-Adressen enthält, wenn mehrere Proxys übergeben werden. Behandelt die Parse-Methode das korrekt? – 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; 
} 

Zuerst versuchen Proxy IP, um herauszufinden, ob seine Null wir bekommen können dass das System IP

0

Versuchen Sie, diese externe IP-Adresse des Benutzers zu erhalten ..

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