c# visual Como obter o endereço IP do cliente de um usuário no ASP.NET?




visual studio c# get ip address (14)

Como outros já disseram, você não pode fazer o que está pedindo. Se você descrever o problema que está tentando resolver, talvez alguém possa ajudar? Por exemplo, você está tentando identificar exclusivamente seus usuários? Você poderia usar um cookie ou a ID da sessão, talvez, em vez do endereço IP?

Editar O endereço que você vê no servidor não deve ser o endereço do ISP, como você diz que seria um grande alcance. O endereço para um usuário doméstico em banda larga será o endereço em seu roteador, portanto, todos os dispositivos dentro da casa aparecerão no lado de fora para ser o mesmo, mas o roteador usa NAT para garantir que o tráfego seja roteado para cada dispositivo corretamente. Para usuários que acessam de um ambiente de escritório, o endereço pode ser o mesmo para todos os usuários. Os sites que usam o endereço IP para ID correm o risco de fazer tudo errado - os exemplos que você dá são bons e eles geralmente falham. Por exemplo, meu escritório está no Reino Unido, o ponto de fuga (onde "apareci" estar na internet) está em outro país onde a nossa principal instalação de TI é, portanto, do meu escritório meu endereço IP parece não estar no Reino Unido. Por esse motivo, não consigo acessar apenas o conteúdo da web do Reino Unido, como o BBC iPlayer). A qualquer momento, haveria centenas, ou até milhares, de pessoas na minha empresa que parecem estar acessando a Web pelo mesmo endereço IP.

Quando você está escrevendo o código do servidor, você nunca pode ter certeza do que o endereço IP está se referindo. Alguns usuários gostam desse jeito. Algumas pessoas usam deliberadamente um proxy ou VPN para confundi-lo ainda mais.

Quando você diz que o endereço da sua máquina é diferente do endereço IP mostrado no StackOverflow, como você está descobrindo o endereço da sua máquina? Se você está apenas procurando localmente usando ipconfig ou algo assim, eu esperaria que fosse diferente pelas razões que descrevi acima. Se você quiser checar o que o mundo exterior acha, dê uma olhada no whatismyipaddress.com/ .

Este link da Wikipedia sobre NAT fornecerá informações sobre isso.

Temos Request.UserHostAddress para obter o endereço IP no ASP.NET, mas 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 real?

Por exemplo, em um perfil de usuário de estouro de pilha, ele é: "Última atividade da conta: há 4 horas de 86.123.127.8" , mas o endereço IP da minha máquina é um pouco diferente. Como o Stack Overflow obtém esse endereço?

Em alguns sistemas da web, há uma verificação de endereço IP para alguns propósitos. Por exemplo, com um determinado endereço IP, a cada 24 horas o usuário pode ter apenas 5 cliques nos links de download? Esse endereço IP deve ser exclusivo, não para um provedor que tenha uma enorme gama de clientes ou usuários da Internet.

Eu entendi bem?


Acho que devo compartilhar minha experiência com todos vocês. Bem, eu vejo em algumas situações REMOTE_ADDR não vai te dar o que você está procurando. Por exemplo, se você tiver um balanceador de carga atrás da cena e se estiver tentando obter o IP do cliente, estará em apuros. Eu verifiquei com o meu software de máscara de IP e também verifiquei com meus colegas em diferentes continentes. Então aqui está a minha solução.

Quando quero saber o IP de um cliente, tento escolher todas as provas possíveis para poder determinar se são únicas:

Aqui eu encontrei outro sever-var que poderia ajudar a todos, se você quiser obter o IP exato do lado do cliente. então estou usando: HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP sempre obtém o IP exato do cliente. Em qualquer caso, se ele não está lhe dando o valor, você deve procurar HTTP_X_FORWARDED_FOR como é o segundo melhor candidato para obter o IP do cliente e, em seguida, o REMOTE_ADDR var que pode ou não retornar o IP, mas para mim ter todos esses três é o que eu acho a melhor coisa para monitorá-los.

Espero que isso ajude alguns caras.


Se c # é assim, é muito simples

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

O que você pode fazer é armazenar o IP do roteador do seu usuário e também o IP encaminhado e tentar torná-lo confiável usando ambos os IPs [External Public e Internal Private]. Mas, novamente, após alguns dias, o cliente poderá receber um novo IP interno do roteador, mas será mais confiável.


Se você estiver usando 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;
    }
}

então

string IPAddress = Request.GetIPAddress();

Combinando as respostas de @mangokun 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;
    }
}

Todas as respostas até agora levam em conta o cabeçalho X-Forwarded-For não-padronizado, mas muito comum. Há um cabeçalho Forwarded padronizado que é um pouco mais difícil de analisar. 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 esses dois 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 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; }
        }
    }
}

Você pode usar:

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

usar no arquivo 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"];
}

string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;

Muitas vezes você vai querer saber o endereço IP de alguém que visita seu site. Embora o ASP.NET tenha várias maneiras de fazer isso, uma das melhores maneiras que vimos é usar o "HTTP_X_FORWARDED_FOR" da coleção ServerVariables.

Aqui está o porquê...

Às vezes, seus visitantes ficam atrás de um servidor proxy ou de um roteador e o Request.UserHostAddress padrão captura apenas o endereço IP do servidor proxy ou roteador. Quando este é o caso, o endereço IP do usuário é então armazenado na variável do servidor ("HTTP_X_FORWARDED_FOR").

Então, o que queremos fazer é primeiro verificar "HTTP_X_FORWARDED_FOR" e se estiver vazio, basta retornar ServerVariables("REMOTE_ADDR") .

Embora esse método não seja infalível, pode levar a melhores resultados. Abaixo está o código ASP.NET em VB.NET, retirado da postagem do blog de James Crowley "Gotcha: HTTP_X_FORWARDED_FOR retorna vários endereços IP"

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

Olá pessoal A maioria dos códigos que você encontrará retornará o endereço IP do seu servidor e não o endereço IP do cliente. Entretanto, este código retorna o endereço IP do cliente correto.Envie uma chance. Para mais informações, basta verificar isso

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

para obter o seu endereço IP local usando javascript você pode usar colocar este código dentro de sua tag 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 seu endereço IP público, você pode usar esse código dentro da sua tag de script

  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>

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, retransmissão ou o que for.

A camada Application não deve depender do endereço IP de forma alguma. Em particular, um endereço IP não deve ser um identificador de nada além do idenfitier de uma extremidade de uma conexão de rede. Assim que uma conexão é fechada, você deve esperar que o endereço IP (do mesmo usuário) seja alterado.


Experimentar:

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




ip-address