Temos que Request.UserHostAddress
obter o endereço IP no ASP.NET, mas esse 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 do Stack Overflow, é: "Ú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 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 de serviços de Internet que tenha uma enorme variedade de clientes ou usuários da Internet.
Eu entendi bem?
fonte
Respostas:
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
EditarO endereço que você vê no servidor não deve ser o endereço do ISP, pois você diz que seria um intervalo enorme. O endereço para um usuário doméstico em banda larga será o endereço no roteador; portanto, todos os dispositivos internos parecerão iguais, mas o roteador usa o NAT para garantir que o tráfego seja roteado corretamente para cada dispositivo. Para usuários acessando 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 identificação correm o risco de cometer erros muito graves - os exemplos que você dá são bons e geralmente falham. Por exemplo, meu escritório está no Reino Unido, o ponto de interrupção (onde "pareço estar" na Internet) está em outro país onde nossa principal instalação de TI está; 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, centenas ou mesmo milhares de pessoas na minha empresa parecem acessar a web a partir do mesmo endereço IP.
Ao escrever o código do servidor, você nunca pode ter certeza a que se refere o endereço IP que vê. Alguns usuários gostam desta maneira. 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 está descobrindo o endereço da sua máquina? Se você está apenas procurando localmente usando
ipconfig
algo assim, eu esperaria que fosse diferente pelas razões descritas acima. Se você quiser verificar o que o mundo exterior pensa, dê uma olhada no whatismyipaddress.com/ .Este link da Wikipedia no NAT fornecerá algumas informações sobre isso.
fonte
Muitas vezes, você deseja 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 estão atrás de um servidor proxy ou de um roteador e o padrão
Request.UserHostAddress
captura apenas o endereço IP do servidor ou roteador proxy. Quando esse for o caso, o endereço IP do usuário será 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, simplesmente retornamos
ServerVariables("REMOTE_ADDR")
.Embora esse método não seja infalível, ele pode levar a melhores resultados. Abaixo está o código ASP.NET no VB.NET, obtido na postagem do blog de James Crowley "Gotcha: HTTP_X_FORWARDED_FOR retorna vários endereços IP"
C #
VB.NET
fonte
what we actually needed to be doing was take the last IP address
mas seu código é o primeiroaddresses[0]
. Qual é correto?addresses.Length != 0
não é necessário, uma vez que nunca pode ser 0.ATUALIZAÇÃO: Obrigado a Bruno Lopes. Se vários endereços IP vierem, é necessário usar este método:
fonte
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Se for c # veja dessa maneira, é muito simples
fonte
O que mais você considera o endereço IP do usuário? Se você deseja o endereço IP do adaptador de rede, receio que não haja maneira possível de fazer isso em um aplicativo Web. Se o seu usuário estiver com NAT ou outras coisas, você também não poderá obter o IP.
Atualização : Embora existam sites que usam IP para limitar o usuário (como o rapidshare), eles não funcionam corretamente em ambientes NAT.
fonte
Acho que devo compartilhar minha experiência com todos vocês. Bem, em algumas situações, o REMOTE_ADDR NÃO dará o que você está procurando. Por exemplo, se você tiver um Balanceador de Carga nos bastidores e se estiver tentando obter o IP do Cliente, estará em apuros. Eu verifiquei com meu software de máscara de IP e também 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 evidências possíveis para determinar se elas são únicas:
Aqui encontrei outro sever-var que poderia ajudar a todos, se você deseja obter o IP exato do lado do cliente. então estou usando: HTTP_X_CLUSTER_CLIENT_IP
HTTP_X_CLUSTER_CLIENT_IP sempre fornece o IP exato do cliente. De qualquer forma, se não fornecer o valor, você deve procurar HTTP_X_FORWARDED_FOR , pois é 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, tendo tudo isso três é o que acho melhor para monitorá-los.
Espero que isso ajude alguns caras.
fonte
Você pode usar:
fonte
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
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 de aplicativo não deve depender do endereço IP de forma alguma. Em particular, um endereço IP não deve ser um identificador de outra coisa senão o identificador mais adequado 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) mude.
fonte
Até agora, todas as respostas levam em consideração o cabeçalho não padronizado, mas muito comum
X-Forwarded-For
. Existe umForwarded
cabeçalho padronizado que é um pouco mais difícil de analisar. Alguns exemplos são os seguintes:Eu escrevi uma classe que leva em consideração esses dois cabeçalhos ao determinar o endereço IP de um cliente.
Abaixo estão alguns testes de unidade que eu usei para validar minha solução:
fonte
Se você estiver usando o CloudFlare, poderá tentar este método de extensão :
então
fonte
fonte
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 os dois IPs [Público externo e Privado interno]. Mas novamente depois de alguns dias, o cliente pode receber um novo IP interno do roteador, mas ele será mais confiável.
fonte
Combinando as respostas de @Tony e @mangokun , eu criei o método de extensão a seguir:
fonte
HTTP_X_FORWARDED_FOR
mas nãoX_FORWARDED_FOR
? Eles são os mesmos?usar no arquivo ashx
fonte
Usar;
fonte
É fácil.Tente:
só isso :))
fonte
Olá pessoal A maioria dos códigos que você encontrará retornará o endereço IP do servidor e não o endereço IP do cliente. De qualquer forma esse código retornará o endereço IP do cliente correto. Para obter mais informações, basta verificar isso
https://www.youtube.com/watch?v=Nkf37DsxYjI
para obter seu endereço IP local usando javascript, você pode colocar esse código dentro da sua tag de script
e Para obter seu endereço IP público, você pode usar esse código dentro da sua tag de script
fonte
usa isto
fonte
Tentar:
fonte