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?20 answers
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.
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")
.
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
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"];
}
Se é c# veja desta maneira, é muito simples
string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ??
Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();
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.
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.Pode usar:
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();
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.
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; }
}
}
}
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();
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;
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.
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;
}
}
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"];
}
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();
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>
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();
}
}
var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress;
Apenas isso:)
Utilize este
Dns.GetHostEntry(Dns.GetHostName())
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;
}