Como obter o endereço IP do cliente de um utilizador ASP.NET?

temos {[[0]} para obter o endereço IP em ASP.NET, mas este é geralmente o endereço IP do ISP do Usuário, não exatamente o endereço IP da máquina do usuário que, por exemplo, clicou em um link. Como posso obter o endereço IP verdadeiro?

por exemplo, num perfil de utilizador de sobrecarga de pilha é: "Última actividade da Conta: 4 horas atrás a partir de 86.123.127.8" , mas o meu endereço IP da máquina é um pouco diferente. Como é que o Stack Overflow consegue Este endereço?

Em alguns sistemas web existe um Verificação de endereço IP para alguns fins. Por exemplo, com um determinado endereço IP, para cada 24 horas Pode o usuário apenas ter apenas 5 cliques em links de download? Este endereço IP deve ser único, não para um ISP que tem uma grande variedade de clientes ou usuários de Internet.

Se percebi bem?

Author: Peter Mortensen, 2009-04-09

20 answers

Como outros disseram, não podes fazer o que estás a pedir. Se você descrever o problema que está tentando resolver talvez alguém possa ajudar?

Por exemplo

    Está a tentar identificar os seus utilizadores? Pode usar um cookie ou o ID da sessão em vez do endereço IP?

Edite o endereço que você vê no servidor não deve ser o endereço do ISP, como você diz que seria um grande intervalo. O endereço de um utilizador doméstico em banda larga será seja o endereço em seu roteador, para que cada dispositivo dentro da casa aparecerá no exterior para ser o mesmo, mas o roteador usa NAT para garantir que o tráfego é encaminhado para cada dispositivo corretamente. Para os usuários que acessam a partir de um ambiente de escritório, o endereço pode muito bem ser o mesmo para todos os usuários. Sites que usam o endereço IP para ID correm o risco de ficar muito errado - Os exemplos que você dá são bons e muitas vezes falham. Por exemplo, o meu escritório é no Reino Unido, o ponto de fuga (onde eu "apareço" para estar em a internet) está em outro país onde a nossa principal facilidade de TI é, por isso, a partir do meu escritório meu endereço IP parece não estar no Reino Unido. Por esta razão, eu não posso acessar o Reino Unido apenas conteúdo web, como o BBC iPlayer). Em qualquer momento, haveria centenas, ou mesmo milhares, de pessoas na minha empresa que parecem estar acessando a web a partir do mesmo endereço IP.

Quando está a escrever o código do servidor, nunca poderá ter a certeza a que endereço IP se refere. Alguns usuários gostam assim. Cerca as pessoas usam deliberadamente um proxy ou VPN para o confundir ainda mais.

Quando diz que o seu endereço de máquina é diferente do endereço IP mostrado no StackOverflow, como está a descobrir o seu endereço de máquina? Se você está apenas olhando localmente usando {[[0]} ou algo do género, eu esperaria que fosse diferente pelas razões que eu delineei acima. Se você quiser verificar novamente o que o mundo exterior pensa dê uma olhada whatismyipaddress.com/.

This Wikipedia link on A NAT vai dar-te informações sobre isto.

 143
Author: Steve, 2020-02-18 10:27:37

Muitas vezes você vai querer saber o endereço IP de alguém que visita o seu site. Enquanto ASP.NET tem várias maneiras de fazer isso uma das melhores maneiras que temos visto é usando o "HTTP_X_FORWARDED_ for" da coleção ServerVariables.

Eis o porquê...

Às vezes os seus visitantes estão por trás de um servidor proxy ou de um roteador e o padrão Request.UserHostAddress só captura o endereço IP do servidor proxy ou do roteador. Quando este é o caso, o endereço IP do Usuário é então armazenado no servidor variável ("HTTP_X_FORWARDED_FOR").

Então o que queremos fazer é primeiro verificar "HTTP_X_ FORWARDED_ for" e se isso estiver vazio, então simplesmente retornaremos ServerVariables("REMOTE_ADDR").

Embora este método não seja infalível, pode conduzir a melhores resultados. Abaixo está o ASP.NET código em VB.NET, retirado do blog de James Crowley "Gotcha: HTTP_ x_ FORWARDED_ for returns multiple IP addresses"

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
 460
Author: mangokun, 2015-12-09 10:10:17

Actualizar: Graças ao Bruno Lopes. Se vários endereços ip puderam vir então necessidade de usar este método:

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

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

        return Request.ServerVariables["REMOTE_ADDR"];
    }
 84
Author: algreat, 2016-09-13 20:09:48

Se é c# veja desta maneira, é muito simples

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();
 25
Author: Juan David Nicholls Cardona, 2015-06-01 22:55:36

Que mais considera o endereço IP do utilizador? Se você quer o endereço IP do adaptador de rede, receio que não haja nenhuma maneira possível de fazê-lo em um aplicativo Web. Se o seu usuário está por trás do NAT ou outras coisas, você não pode obter o IP também.

Update : embora existam sites Web que usam o IP para limitar o utilizador (como o rapidshare), eles não funcionam correctamente nos ambientes NAT.

 24
Author: mmx, 2009-04-19 20:23:41
Acho que devia partilhar a minha experiência convosco. Bem, eu vejo que em algumas situações O REMOTE_ADDR não vai conseguir o que você está procurando. Por exemplo, se você tem um Balancer de carga por trás da cena e se você está tentando obter o IP do cliente, então você estará em apuros. Verifiquei com o meu software de máscara de IP e também verifiquei com os meus colegas estarem em continentes diferentes. Então aqui está a minha solução. Quando quero saber o IP de um cliente, tento escolher todas as possíveis provas para poder determinar se são únicas. Aqui encontrei outro sever-var que vos pode ajudar a todos se quiserem obter o IP exacto do lado do cliente. por isso, estou a usar: HTTP_ x_ CLIENT_ IP

HTTP_ x_ CLUSTER_ CLIENT_IP dá-lhe sempre o IP exacto do cliente. Em qualquer caso, se não lhe estiver a dar o valor, deverá então procurar por HTTP_ x_ FORWARDED_ for Como é o segundo melhor candidato a obter-lhe o IP do cliente e, em seguida, o REMOTE_ADDR var que pode ou não devolver-te o IP, mas para mim ter todos estes três é o que eu acho a melhor coisa para monitorizá-los.

Espero que isto ajude alguns tipos.
 23
Author: KMX, 2012-11-15 16:27:24

Pode usar:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();
 15
Author: Bat_Programmer, 2011-09-27 00:20:23

Os endereços IP fazem parte da camada de rede Na "pilha de sete camadas". A camada de rede pode fazer o que quiser com o endereço IP. É o que acontece com um servidor proxy, NAT, relay, ou o que quer que seja.

A camada de aplicação não deve depender do endereço IP de forma alguma. Em particular, um endereço IP não se destina a ser um identificador de qualquer outra coisa que não seja o identificador de um fim de uma conexão de rede. Assim que uma conexão é fechada, você deve esperar o IP endereço (do mesmo Utilizador) a alterar.

 13
Author: John Saunders, 2009-04-09 18:32:25

Todas as respostas até agora têm em conta o não-padronizado, mas Muito comum, X-Forwarded-For cabeçalho. Existe um padrão Forwarded cabeçalho que é um pouco mais difícil de processar. Alguns exemplos são os seguintes:

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
Eu escrevi uma classe que leva ambos os cabeçalhos em conta ao determinar o endereço IP de um cliente.
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;
        }
    }
}

Abaixo estão alguns testes de unidade que usei para validar a minha solução:

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; }
        }
    }
}
 11
Author: dana, 2017-07-12 04:47:20

Se estiver a utilizar CloudFlare, você pode tentar este método de extensão :

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

Depois

string IPAddress = Request.GetIPAddress();
 10
Author: Tony, 2016-07-23 22:03:38
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;
 8
Author: GorkemHalulu, 2014-07-15 07:38:15

O que pode fazer é armazenar o IP do router do seu utilizador e também o IP reencaminhado e tentar torná-lo fiável, utilizando tanto o IPs [público externo e privado interno]. Mas novamente depois de alguns dias o cliente pode ser atribuído novo IP interno do router, mas será mais confiável.

 7
Author: Shahid, 2011-08-04 15:22:47

Combinando as respostas de @Tony e @mangokun, criei o seguinte método de extensão:

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;
    }
}
 6
Author: Nitesh, 2018-04-07 19:58:43

Utilizar no ficheiro ashx

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
Author: Behnam Mohammadi, 2014-03-09 07:49:39
public static class Utility
{
    public static string GetClientIP(this System.Web.UI.Page page)
    {
        string _ipList = page.Request.Headers["CF-CONNECTING-IP"].ToString();
        if (!string.IsNullOrWhiteSpace(_ipList))
        {
            return _ipList.Split(',')[0].Trim();
        }
        else
        {
            _ipList = page.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"];
            if (!string.IsNullOrWhiteSpace(_ipList))
            {
                return _ipList.Split(',')[0].Trim();
            }
            else
            {
                _ipList = page.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (!string.IsNullOrWhiteSpace(_ipList))
                {
                    return _ipList.Split(',')[0].Trim();
                }
                else
                {
                    return page.Request.ServerVariables["REMOTE_ADDR"].ToString().Trim();
                }
            }
        }
    }
}

Utilizar;

string _ip = this.GetClientIP();
 2
Author: VolkanCetinkaya, 2020-01-22 16:49:05

Olá rapazes, a maioria dos códigos que vão encontrar Irão devolver-vos o endereço ip do servidor e não o endereço ip do cliente .no entanto, este código devolve o endereço ip correcto do cliente.Experimenta. Para mais informações, basta verificar este

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

Para obter o seu endereço IP local usando javascript pode usar coloque este código dentro da sua marca de script

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

E para obter o seu endereço ip público pode usar coloque este código dentro do seu script tag

  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
Author: Shubham, 2018-12-31 05:05:31

No pacote NuGet install Microsoft.AspNetCore.HttpOverrides Então tente:

public class ClientDeviceInfo
    {
        private readonly IHttpContextAccessor httpAccessor;

        public ClientDeviceInfo(IHttpContextAccessor httpAccessor)
        {
            this.httpAccessor = httpAccessor;
        }

        public string GetClientLocalIpAddress()
        {
            return httpAccessor.HttpContext.Connection.LocalIpAddress.ToString();
        }

        public string GetClientRemoteIpAddress()
        {
            return httpAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
        }

        public string GetClientLocalPort()
        {
            return httpAccessor.HttpContext.Connection.LocalPort.ToString();
        }

        public string GetClientRemotePort()
        {
            return httpAccessor.HttpContext.Connection.RemotePort.ToString();
        }
     }
 0
Author: Husam Ebish, 2020-11-25 21:09:09
É fácil.Tenta.
var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;

Apenas isso:)

 -1
Author: akbar, 2020-01-29 14:39:16

Utilize este

Dns.GetHostEntry(Dns.GetHostName())
 -3
Author: user1657913, 2012-12-19 12:10:40

Tentar:

using System.Net;

public static string GetIpAddress()  // Get IP Address
{
    string ip = "";     
    IPHostEntry ipEntry = Dns.GetHostEntry(GetCompCode());
    IPAddress[] addr = ipEntry.AddressList;
    ip = addr[2].ToString();
    return ip;
}
public static string GetCompCode()  // Get Computer Name
{   
    string strHostName = "";
    strHostName = Dns.GetHostName();
    return strHostName;
}
 -7
Author: Nilesh Umaretiya, 2015-07-27 09:59:46