Tenemos Request.UserHostAddress
que obtener la dirección IP en ASP.NET, pero esta suele ser la dirección IP del ISP del usuario, no exactamente la dirección IP de la máquina del usuario que, por ejemplo, hizo clic en un enlace. ¿Cómo puedo obtener la dirección IP real?
Por ejemplo, en un perfil de usuario de Stack Overflow es: "Última actividad de la cuenta: hace 4 horas desde 86.123.127.8" , pero la dirección IP de mi máquina es un poco diferente. ¿Cómo obtiene Stack Overflow esta dirección?
En algunos sistemas web hay una verificación de dirección IP para algunos propósitos. Por ejemplo, con una determinada dirección IP, por cada 24 horas, ¿puede el usuario tener solo 5 clics en los enlaces de descarga? Esta dirección IP debe ser única, no para un ISP que tenga una gran variedad de clientes o usuarios de Internet.
¿Lo entendí bien?
fuente
Respuestas:
Como otros han dicho, no puedes hacer lo que pides. Si describe el problema que está tratando de resolver, ¿tal vez alguien pueda ayudarlo?
P.ej
EditarLa dirección que ve en el servidor no debe ser la dirección del ISP, ya que dice que sería un rango enorme. La dirección para un usuario doméstico en banda ancha será la dirección en su enrutador, por lo que todos los dispositivos dentro de la casa aparecerán en el exterior como iguales, pero el enrutador usa NAT para garantizar que el tráfico se enrute correctamente a cada dispositivo. Para los usuarios que acceden desde un entorno de oficina, la dirección puede ser la misma para todos los usuarios. Los sitios que usan la dirección IP para identificación corren el riesgo de equivocarse: los ejemplos que da son buenos y con frecuencia fallan. Por ejemplo, mi oficina está en el Reino Unido, el punto de ruptura (donde "parezco" estar en Internet) está en otro país donde está nuestra principal instalación de TI, por lo que desde mi oficina mi dirección IP parece no estar en el Reino Unido. Por este motivo, no puedo acceder al contenido web del Reino Unido solamente, como el iPlayer de la BBC). En cualquier momento, habría cientos, o incluso miles, de personas en mi empresa que parecen estar accediendo a la web desde la misma dirección IP.
Cuando escribe código de servidor, nunca puede estar seguro de a qué se refiere la dirección IP que ve. A algunos usuarios les gusta de esta manera. Algunas personas usan deliberadamente un proxy o VPN para confundirlo aún más.
Cuando dice que la dirección de su máquina es diferente a la dirección IP que se muestra en StackOverflow, ¿cómo encuentra la dirección de su máquina? Si solo está buscando usar localmente
ipconfig
o algo así, esperaría que fuera diferente por las razones que describí anteriormente. Si desea verificar dos veces lo que piensa el mundo exterior, eche un vistazo a whatismyipaddress.com/ .Este enlace de Wikipedia en NAT le proporcionará algunos antecedentes sobre esto.
fuente
A menudo, querrá saber la dirección IP de alguien que visita su sitio web. Si bien ASP.NET tiene varias formas de hacer esto, una de las mejores formas que hemos visto es mediante el uso de "HTTP_X_FORWARDED_FOR" de la colección ServerVariables.
Este es el por qué...
Algunas veces sus visitantes están detrás de un servidor proxy o un enrutador y el estándar
Request.UserHostAddress
solo captura la dirección IP del servidor proxy o enrutador. En este caso, la dirección IP del usuario se almacena en la variable del servidor ("HTTP_X_FORWARDED_FOR").Entonces, lo que queremos hacer es primero verificar "HTTP_X_FORWARDED_FOR" y si eso está vacío, simplemente regresamos
ServerVariables("REMOTE_ADDR")
.Si bien este método no es infalible, puede conducir a mejores resultados. A continuación se muestra el código ASP.NET en VB.NET, tomado de la publicación del blog de James Crowley "Gotcha: HTTP_X_FORWARDED_FOR devuelve múltiples direcciones IP"
C#
VB.NET
fuente
what we actually needed to be doing was take the last IP address
pero su código obtiene el primeroaddresses[0]
. ¿Cual es correcta?addresses.Length != 0
no es necesario, ya que nunca puede ser 0.ACTUALIZACIÓN: Gracias a Bruno Lopes. Si pueden venir varias direcciones IP, entonces necesita usar este método:
fuente
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Si es c # mira de esta manera, es muy simple
fuente
¿Qué más considera la dirección IP del usuario? Si desea la dirección IP del adaptador de red, me temo que no hay forma posible de hacerlo en una aplicación web. Si su usuario está detrás de NAT u otras cosas, tampoco puede obtener la IP.
Actualización : si bien hay sitios web que usan IP para limitar al usuario (como rapidshare), no funcionan correctamente en entornos NAT.
fuente
Creo que debería compartir mi experiencia con todos ustedes. Bueno, veo que en algunas situaciones REMOTE_ADDR NO le conseguirá lo que está buscando. Por ejemplo, si tiene un Load Balancer detrás de escena y si está tratando de obtener la IP del Cliente, entonces estará en problemas. Lo verifiqué con mi software de enmascaramiento de IP y también con mis colegas que se encuentran en diferentes continentes. Entonces aquí está mi solución.
Cuando quiero conocer la IP de un cliente, trato de elegir todas las pruebas posibles para poder determinar si son únicas:
Aquí encontré otro sever-var que podría ayudarlos a todos si desean obtener la IP exacta del lado del cliente. entonces estoy usando: HTTP_X_CLUSTER_CLIENT_IP
HTTP_X_CLUSTER_CLIENT_IP siempre le proporciona la IP exacta del cliente. En cualquier caso, si no le está dando el valor, debe buscar HTTP_X_FORWARDED_FOR ya que es el segundo mejor candidato para obtener la IP del cliente y luego la var REMOTE_ADDR que puede devolverle la IP o no, pero para mí tener todo esto tres es lo que mejor encuentro para monitorearlos.
Espero que esto ayude a algunos chicos.
fuente
Puedes usar:
fuente
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.
Las direcciones IP son parte de la capa de red en la "pila de siete capas". La capa de red puede hacer lo que quiera con la dirección IP. Eso es lo que sucede con un servidor proxy, NAT, retransmisión o lo que sea.
La capa de aplicación no debe depender de la dirección IP de ninguna manera. En particular, una dirección IP no pretende ser un identificador de otra cosa que no sea el identificador de un extremo de una conexión de red. Tan pronto como se cierra una conexión, debe esperar que cambie la dirección IP (del mismo usuario).
fuente
Todas las respuestas hasta ahora tienen en cuenta el encabezado no estandarizado, pero muy común
X-Forwarded-For
. Hay unForwarded
encabezado estandarizado que es un poco más difícil de analizar. Algunos ejemplos son los siguientes:He escrito una clase que tiene en cuenta estos dos encabezados al determinar la dirección IP de un cliente.
A continuación se presentan algunas pruebas unitarias que utilicé para validar mi solución:
fuente
Si está utilizando CloudFlare, puede probar este Método de extensión :
entonces
fuente
fuente
Lo que puede hacer es almacenar la IP del enrutador de su usuario y también la IP reenviada e intentar que sea confiable utilizando las IP [Public Public y Internal Private]. Pero nuevamente, después de algunos días, se le puede asignar al cliente una nueva IP interna desde el enrutador, pero será más confiable.
fuente
Combinando las respuestas de @Tony y @mangokun , he creado el siguiente método de extensión:
fuente
HTTP_X_FORWARDED_FOR
pero noX_FORWARDED_FOR
? ¿Son lo mismo?utilizar en archivo ashx
fuente
Utilizar;
fuente
Es fácil. Pruébalo:
solo esto :))
fuente
Hola chicos La mayoría de los códigos que encontrarás te devolverán la dirección IP del servidor, no la dirección IP del cliente. Sin embargo, este código devuelve la dirección IP correcta del cliente. Pruébalo. Para más información solo marque esto
https://www.youtube.com/watch?v=Nkf37DsxYjI
para obtener su dirección IP local usando JavaScript, puede usar poner este código dentro de su etiqueta de script
y Para obtener su dirección IP pública, puede usar poner este código dentro de su etiqueta de script
fuente
utilizar este
fuente
Tratar:
fuente