Frage

Ich sammle Statistiken über IP-Adressen, von dem Benutzer meiner Website besuchen und ich habe bemerkt, was es gibt nur zwei IP-Adressen vorgestellt, 172.16.16.1 und 172.16.16.248. Die Eigenschaft I IP-Adresse zu ermitteln, verwenden

Request.UserHostAddress

Was ist ein Grund für die IP-Adressinformationen sein könnten verlieren? Alle Benutzer sind aus der ganzen Welt, so dass sie cann't hinter nur zwei Proxies sein.

War es hilfreich?

Lösung

Das sieht aus wie die Arbeit eines Reverse-Proxy. Wenn Sie einen Reverse-Proxy verwenden, verbindet sich der Client an den Proxy, der sich um eine neue Verbindung zum Server öffnet. Da ASP.NET die Infos der eingehenden Verbindung verwendet die Benutzeradresse zu füllen, können Sie die Adresse der Reverse-Proxy erhalten.

Wenn Sie in der Tat in dieser Konfiguration sind, werden Sie die Hilfe der Reverse-Proxy benötigen die richtigen Informationen zu erhalten. Die meisten Reverse-Proxys bieten die Möglichkeit, einen Header der HTTP-Anforderung hinzuzufügen, mit der realen IP-Adresse des Clients. Überprüfen Sie die Dokumentation Ihres Proxy.

Andere Tipps

Sie möchten vielleicht so etwas wie diese;

string SourceIP = String.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? Request.ServerVariables["REMOTE_ADDR"] : Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",")[0];

Der HTTP_X_FORWARDED_FOR Header wird die IP-Adresse hinter Proxy-Server.

Sehen Sie diese Seite, warum näher erläutert; Die Real IP Ihre Benutzer

Aufbauend auf Dave Anderson Antwort, hier ist ein Ausschnitt, der eine Kette von Reverse-Proxys berücksichtigt.

string forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

string ipStr = string.IsNullOrWhiteSpace(forwardedFor) 
                   ? Request.ServerVariables["REMOTE_ADDR"] 
                   : forwardedFor.Split(',').Select(s => s.Trim()).First();

Ich nehme an, Sie sind hinter einem NAT / Reverse Proxy so denke ich, Sie verwenden müssen:

Request.ServerVariables("REMOTE_ADDR") 

Wahrscheinlich 172.16.0.0/12 ist Ihr privat LAN wo 172.16.16.248 Ihre eigene Adresse und 172.16.16.1 die Adresse des Routers / Proxy.

Request.ServerVariables ( "REMOTE_ADDR") wird nicht funktionieren. dieses Problem ist, weil ur-Server wahrscheinlich hinter einem Proxy ist. (oder über einen Netzwerk mit dem Internet verbunden) oder Ihre Router-Einstellungen werden als NAT (Network Address Translation) diese Technik tut Pass ip-Server festgelegt. In solchen Situationen kann u nicht-Adresse erhalten IP mit Asp.net jedoch Java-Applet Stellen mit denen u IP-Adresse in jedem Fall erhalten.

(Netscape, Mozilla und Firefox nur und Java muss aktiviert sein)

<script language="javascript" type="text/javascript">   

if (navigator.appName.indexOf("Netscape") != -1){
ip = "" + java.net.InetAddress.getLocalHost().getHostAddress();
document.write("<b>Your IP address is " + ip+'</b>');
}
else {
document.write("<b>IP Address only shown in Netscape with Java enabled!</b>");
}

</script>

Die beiden Adressen, die Sie aufgelistet haben es aus einem der Bereiche definiert als privat zu sein. (Siehe hier für Beschreibung)

Es klingt eher wie Sie sammeln die interne Adresse des eigenen Firewall bis (s)?

Basierend auf tomfannings beantworten ...

 public static string ClientIp(this HttpRequestBase @this) {
  var clientIp = string.Empty;
  string forwardedFor = @this.ServerVariables["HTTP_X_FORWARDED_FOR"];

  if (string.IsNullOrWhiteSpace(forwardedFor)) {
    clientIp = @this.ServerVariables["REMOTE_ADDR"];
  } else {

    var array = forwardedFor
      .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
      .Select(s => s.Trim());

    foreach (var element in array) {
      if (element.IsValidIp4() || element.IsValidIp6()) {
        clientIp = element;
        break;
      }
    }
  }
  return clientIp;
}

public static bool IsValidIp4(this string @this) {
  var pattern = new Regex(@"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$");
  return pattern.IsMatch(@this);
}

public static bool IsValidIp6(this string @this) {
  var pattern = new Regex(@"^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/(d|dd|1[0-1]d|12[0-8]))$");
  return pattern.IsMatch(@this);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top