it-swarm.com.de

Wie bekomme ich die Client-IP-Adresse eines Benutzers in ASP.NET?

Wir haben Request.UserHostAddress, um die IP-Adresse in ASP.NET abzurufen. Dies ist jedoch normalerweise die IP-Adresse des ISP des Benutzers, nicht genau die IP-Adresse des Computers des Benutzers, die beispielsweise auf einen Link geklickt hat. Wie kann ich die echte IP-Adresse erhalten?

In einem Stack Overflow-Benutzerprofil lautet es beispielsweise: "Letzte Kontoaktivität: Vor 4 Stunden von 86.123.127.8" , aber die IP-Adresse meines Computers ist etwas anders. Wie erhält der Stack Overflow diese Adresse? 

In einigen Web-Systemen gibt es für einige Zwecke eine IP-Adressprüfung. Kann der Benutzer beispielsweise mit einer bestimmten IP-Adresse alle 24 Stunden nur 5 Klicks auf die Download-Links haben? Diese IP-Adresse sollte eindeutig sein, nicht für einen ISP, der über eine große Anzahl von Clients oder Internetbenutzern verfügt.

Habe ich gut verstanden?

350
mahdiahmadirad

Wie andere gesagt haben, können Sie nicht tun, was Sie fragen. Wenn Sie das Problem beschreiben, das Sie lösen möchten, kann vielleicht jemand helfen? Z.B. Versuchen Sie, Ihre Benutzer eindeutig zu identifizieren? Könnten Sie anstelle der IP-Adresse möglicherweise ein Cookie oder die Sitzungs-ID verwenden?

Edit Die Adresse, die Sie auf dem Server sehen, sollte nicht die Adresse des Internetdienstanbieters sein, da Sie sagen, dass dies eine große Bandbreite wäre. Die Adresse für einen Heimbenutzer auf Breitband ist die Adresse an seinem Router. Jedes Gerät innerhalb des Hauses erscheint außen als gleich, aber der Router verwendet NAT, um sicherzustellen, dass der Datenverkehr an jedes Gerät geleitet wird korrekt. Für Benutzer, die von einer Büroumgebung aus zugreifen, kann die Adresse für alle Benutzer identisch sein. Bei Websites, die die IP-Adresse für IDs verwenden, besteht die Gefahr, dass sie sehr fehlerhaft wird. Die von Ihnen angeführten Beispiele sind gut und schlagen häufig fehl. Zum Beispiel befindet sich mein Büro in Großbritannien, der Breakout-Point (an dem ich "im Internet zu sein scheine"), befindet sich in einem anderen Land, in dem sich unsere IT-Abteilung befindet. Aus meinem Büro scheint meine IP-Adresse nicht in Großbritannien zu sein. Aus diesem Grund kann ich nicht nur auf UK-Inhalte (wie den BBC iPlayer) zugreifen. Zu jeder Zeit gab es hunderte oder sogar tausende von Leuten in meiner Firma, die scheinbar von derselben IP-Adresse aus auf das Web zugreifen.

Wenn Sie Servercode schreiben, können Sie nie sicher sein, auf welche IP-Adresse Sie sich beziehen. Einige Benutzer mögen es so. Einige Leute verwenden absichtlich einen Proxy oder ein VPN, um Sie weiter zu verwirren.

Wenn Sie sagen, dass Ihre Computeradresse sich von der in StackOverflow angezeigten IP-Adresse unterscheidet, wie finden Sie Ihre Computeradresse heraus? Wenn Sie nur ipconfig oder etwas ähnliches suchen, würde ich erwarten, dass es aus den oben genannten Gründen anders ist. Wenn Sie noch einmal nachprüfen wollen, was die Außenwelt denkt, dann schauen Sie nach whatismyipaddress.com/ .

Dieser Wikipedia-Link zu NAT gibt Ihnen einen Hintergrund dazu.

131
Steve Haigh

Häufig möchten Sie die IP-Adresse einer Person erfahren, die Ihre Website besucht. ASP.NET bietet mehrere Möglichkeiten, dies zu tun. Eine der besten Methoden, die wir bisher gesehen haben, ist die Verwendung von "HTTP_X_FORWARDED_FOR" der ServerVariables-Auflistung.

Hier ist der Grund...

Manchmal befinden sich Ihre Besucher entweder hinter einem Proxy-Server oder einem Router, und der Standardcode Request.UserHostAddress erfasst nur die IP-Adresse des Proxy-Servers oder Routers. Wenn dies der Fall ist, wird die IP-Adresse des Benutzers in der Servervariablen ("HTTP_X_FORWARDED_FOR") gespeichert.

Also wollen wir zuerst "HTTP_X_FORWARDED_FOR" prüfen und wenn das leer ist, dann geben wir einfach ServerVariables("REMOTE_ADDR") zurück.

Diese Methode ist zwar nicht narrensicher, kann jedoch zu besseren Ergebnissen führen. Unten ist der ASP.NET-Code in VB.NET aus James Crowleys Blogeintrag "Gotcha: HTTP_X_FORWARDED_FOR gibt mehrere IP-Adressen zurück"

C # 

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current; 
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function
405
mangokun

UPDATE: Danke an Bruno Lopes. Wenn mehrere IP-Adressen kommen könnten, müssen Sie diese Methode verwenden:

    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }
70
algreat

Wie sehen Sie die IP-Adresse des Benutzers? Wenn Sie die IP-Adresse des Netzwerkadapters benötigen, gibt es leider keine Möglichkeit, dies in einer Web-App zu tun. Wenn sich Ihr Benutzer hinter NAT oder anderem Zeug befindet, können Sie auch keine IP-Adresse erhalten.

Update : Obwohl es Websites gibt, die den Benutzer mithilfe von IP einschränken (wie Rapidshare), funktionieren sie in NAT - Umgebungen nicht ordnungsgemäß.

23
Mehrdad Afshari

Wenn c # diesen Weg sieht, ist das sehr einfach

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();

Ich denke, ich sollte meine Erfahrung mit Ihnen allen teilen. In einigen Situationen sehe ich, dass REMOTE_ADDR Ihnen NICHT das gibt, wonach Sie suchen. Wenn Sie beispielsweise einen Load Balancer hinter den Kulissen haben und versuchen, die IP des Clients zu erhalten, werden Sie in Schwierigkeiten geraten. Ich habe es mit meiner IP-Maskierungssoftware überprüft und auch mit Kollegen auf verschiedenen Kontinenten. Also hier ist meine Lösung.

Wenn ich die IP eines Clients wissen möchte, versuche ich, alle möglichen Beweise auszuwählen, um festzustellen, ob sie eindeutig sind:

Hier habe ich einen anderen Sever-Var gefunden, der Ihnen allen helfen kann, wenn Sie eine genaue IP-Adresse der Clientseite erhalten möchten. also verwende ich: HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP liefert Ihnen immer die genaue IP des Clients. In jedem Fall sollten Sie nach HTTP_X_FORWARDED_FOR suchen, da dies der zweitbeste Kandidat ist, um die Client-IP und dann die REMOTE_ADDR var zu erhalten das IP, aber für mich sind all diese drei das, was ich am besten finde, um sie zu überwachen.

Ich hoffe, das hilft einigen Jungs. 

21
KMX

Sie können verwenden:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();
15
Bat_Programmer

IP-Adressen sind Teil der Netzwerkschicht im "siebenschichtigen Stack". Die Netzwerkschicht kann mit der IP-Adresse alles tun, was sie will. Das passiert bei einem Proxyserver, NAT, Relay oder was auch immer.

Die Anwendungsschicht sollte in keiner Weise von der IP-Adresse abhängen. Insbesondere ist eine IP-Adresse nicht als eine Kennung für etwas anderes als die Kennung eines Endes einer Netzwerkverbindung gedacht. Sobald eine Verbindung geschlossen wird, sollten Sie erwarten, dass sich die IP-Adresse (desselben Benutzers) ändert.

14
John Saunders

Wenn Sie CloudFlare verwenden, können Sie diese Erweiterungsmethode ausprobieren.

public static class IPhelper
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

        return Request.UserHostAddress;
    }
}

dann

string IPAddress = Request.GetIPAddress();
9
Tony
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;
8
GorkemHalulu

Alle Antworten berücksichtigen bisher den nicht standardisierten, aber sehr common, X-Forwarded-For-Header. Es gibt einen standardisierten Forwarded -Header, der etwas schwieriger zu analysieren ist. Einige Beispiele sind wie folgt:

Forwarded: for="_gazonk"
Forwarded: For="[2001:db8:cafe::17]:4711"
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17

Ich habe eine Klasse geschrieben, die diese beiden Header bei der Ermittlung der IP-Adresse eines Clients berücksichtigt.

using System;
using System.Web;

namespace Util
{
    public static class IP
    {
        public static string GetIPAddress()
        {
            return GetIPAddress(new HttpRequestWrapper(HttpContext.Current.Request));
        }

        internal static string GetIPAddress(HttpRequestBase request)
        {
            // handle standardized 'Forwarded' header
            string forwarded = request.Headers["Forwarded"];
            if (!String.IsNullOrEmpty(forwarded))
            {
                foreach (string segment in forwarded.Split(',')[0].Split(';'))
                {
                    string[] pair = segment.Trim().Split('=');
                    if (pair.Length == 2 && pair[0].Equals("for", StringComparison.OrdinalIgnoreCase))
                    {
                        string ip = pair[1].Trim('"');

                        // IPv6 addresses are always enclosed in square brackets
                        int left = ip.IndexOf('['), right = ip.IndexOf(']');
                        if (left == 0 && right > 0)
                        {
                            return ip.Substring(1, right - 1);
                        }

                        // strip port of IPv4 addresses
                        int colon = ip.IndexOf(':');
                        if (colon != -1)
                        {
                            return ip.Substring(0, colon);
                        }

                        // this will return IPv4, "unknown", and obfuscated addresses
                        return ip;
                    }
                }
            }

            // handle non-standardized 'X-Forwarded-For' header
            string xForwardedFor = request.Headers["X-Forwarded-For"];
            if (!String.IsNullOrEmpty(xForwardedFor))
            {
                return xForwardedFor.Split(',')[0];
            }

            return request.UserHostAddress;
        }
    }
}

Nachfolgend einige Unit-Tests, die ich zur Validierung meiner Lösung verwendet habe:

using System.Collections.Specialized;
using System.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UtilTests
{
    [TestClass]
    public class IPTests
    {
        [TestMethod]
        public void TestForwardedObfuscated()
        {
            var request = new HttpRequestMock("for=\"_gazonk\"");
            Assert.AreEqual("_gazonk", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv6()
        {
            var request = new HttpRequestMock("For=\"[2001:db8:cafe::17]:4711\"");
            Assert.AreEqual("2001:db8:cafe::17", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4()
        {
            var request = new HttpRequestMock("for=192.0.2.60;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4WithPort()
        {
            var request = new HttpRequestMock("for=192.0.2.60:443;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedMultiple()
        {
            var request = new HttpRequestMock("for=192.0.2.43, for=198.51.100.17");
            Assert.AreEqual("192.0.2.43", Util.IP.GetIPAddress(request));
        }
    }

    public class HttpRequestMock : HttpRequestBase
    {
        private NameValueCollection headers = new NameValueCollection();

        public HttpRequestMock(string forwarded)
        {
            headers["Forwarded"] = forwarded;
        }

        public override NameValueCollection Headers
        {
            get { return this.headers; }
        }
    }
}
7
dana

Sie können die Router-IP-Adresse Ihres Benutzers und die weitergeleitete IP-Adresse speichern und versuchen, die IP-Adresse des Routers unter Verwendung der beiden IP-Adressen [External Public und Internal Private] zu gewährleisten. Nach einigen Tagen kann dem Client jedoch eine neue interne IP-Adresse vom Router zugewiesen werden. Dies wird jedoch zuverlässiger. 

7
Shahid

Durch die Kombination der Antworten aus @Tony und @mangokun habe ich folgende Erweiterungsmethode erstellt:

public static class RequestExtensions
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
        {
            string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }
        }

        return Request.UserHostAddress;
    }
}
4
Nitesh

verwendung in Ashx-Datei

public string getIP(HttpContext c)
{
    string ips = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ips))
    {
        return ips.Split(',')[0];
    }
    return c.Request.ServerVariables["REMOTE_ADDR"];
}
3

Hallo Jungs Die meisten Codes, die Sie finden werden, geben Ihre Server-IP-Adresse und keine Client-IP-Adresse zurück

https://www.youtube.com/watch?v=Nkf37DsxYjI

um Ihre lokale IP-Adresse mithilfe von Javascript zu erhalten, können Sie

<script>
    var RTCPeerConnection = /*window.RTCPeerConnection ||*/
     window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

         if (RTCPeerConnection) (function () {
             var rtc = new RTCPeerConnection({ iceServers: [] });
             if (1 || window.mozRTCPeerConnection) {      
                 rtc.createDataChannel('', { reliable: false });
             };

             rtc.onicecandidate = function (evt) {

                 if (evt.candidate)
                     grepSDP("a=" + evt.candidate.candidate);
             };
             rtc.createOffer(function (offerDesc) {
                 grepSDP(offerDesc.sdp);
                 rtc.setLocalDescription(offerDesc);
             }, function (e) { console.warn("offer failed", e); });


             var addrs = Object.create(null);
             addrs["0.0.0.0"] = false;
             function updateDisplay(newAddr) {
                 if (newAddr in addrs) return;
                 else addrs[newAddr] = true;
                 var displayAddrs = Object.keys(addrs).filter(function
(k) { return addrs[k]; });
                 document.getElementById('list').textContent =
displayAddrs.join(" or perhaps ") || "n/a";
             }

             function grepSDP(sdp) {
                 var hosts = [];
                 sdp.split('\r\n').forEach(function (line) { 
                     if (~line.indexOf("a=candidate")) {   
                         var parts = line.split(' '),   
                             addr = parts[4],
                             type = parts[7];
                         if (type === 'Host') updateDisplay(addr);
                     } else if (~line.indexOf("c=")) {      
                         var parts = line.split(' '),
                             addr = parts[2];
                         updateDisplay(addr);
                     }
                 });
             }
         })(); else
         {
             document.getElementById('list').innerHTML = "<code>ifconfig| grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
             document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";

         }




</script>
<body>
<div id="list"></div>
</body>

um Ihre öffentliche IP-Adresse zu erhalten, können Sie verwenden. Fügen Sie diesen Code in Ihr Skript-Tag ein

  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }


<script type="application/javascript" src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
0
Shubham