Obtener la IP de conexión de un usuario (aunque entre con un proxy)

El otro día me hicieron una pregunta muy común que es "¿cómo puedo obtener la dirección IP de los usuarios que se conectan a mi aplicación Web ASP.NET?"

La respuesta es directa y sencilla: usando la variable HTTP_CLIENT-IP de las cabeceras del servidor, a través del objeto Request así:

Request.ServerVariables{"HTTP_CLIENT-IP"]

Más fácil imposible.

Sin embargo hay una cuestión que no todo el mundo tiene controlada y es que muchos usuarios acceden a Internet a través de un proxy, y la mayor parte de las veces ni siquiera lo saben. Ello es debido a que algunos proveedores de acceso a Internet (por ejemplo Telefónica en España) para ahorrar ancho de banda utilizan proxies-caché que actúan de hombre en el medio a la hora de acceder a las páginas de Interenet. Si no lo tenemos en cuenta podemos llevarnos más d eun disgusto en nuestras aplicaciones, sobre todo si creemos que con la cabecera anterior ya tenemos la IP del usuario, ya que en realidad obtendremos la IP del Proxy.

¿Cómo obtenemos entonces la verdadera dirección IP del usuario?

Pues también muy fácil, aunque hay que saberlo, claro :-) Hay que consultar otra cabecera y ver si contiene algún valor. Se trata de HTTP_X-Forwarded-For, así:

Request.ServerVariables("HTTP_X-Forwarded-For")

Así, por ejemplo, la siguiente página (a pelo, directamente el código en ella) nos sirve para indicar si un usuario accede a través de un proxy o no y cuáles son las IPs que intervienen en el proceso:

IP que hace la petición: <%= Request.ServerVariables("REMOTE_ADDR") %>
<br>
<%
Dim ClientIP, Forwaded, RealIP

RealIP = ""

ClientIP = Request.ServerVariables("HTTP_CLIENT-IP")
If ClientIP <> "" Then
 RealIP = ClientIP
Else
 Forwaded = Request.ServerVariables("HTTP_X-Forwarded-For")
 If Forwaded <> "" Then RealIP = Forwaded
End If

If RealIP <> "" Then
 Response.Write("El usuario está accediendo a través de un Proxy. Su verdadera dirección IP es: " + RealIP)
End If
%>

Por cierto: esta página tiene una particularidad y es que si cambiamos su extensión a .asp o a .aspx funcionará tanto en ASP clásico como en cualquier versión de ASP.NET.

Espero que a alguien le resulte de utilidad :-)

Archivado en:
Comparte este post:

Comentarios

# Cristian said:

Esto funciona para todos los navegadores?

Thursday, October 25, 2007 11:04 PM
# José M. Alarcón Aguín said:

Pues en principio sí, funciona con todos

Saludos

JM

Friday, October 26, 2007 5:40 PM
# visita said:

No funciona...

Thursday, November 22, 2007 4:41 PM
# José M. Alarcón Aguín said:

¿Qué quiere decir que no funciona? ¿Podrías ser más específico?

Hasta la fecha a mi me ha funcionado siempre....

Saludos

JM.

Thursday, November 22, 2007 4:59 PM
# Cristian said:

A mi me funciono en todos los navegadores, hasta en safari :D saludos

Tuesday, November 27, 2007 2:54 PM
# Javier said:

He usado las ServerVariables en asp.net para obtener la direccion IP del Cliente y no funciona.

Siempre retorna la IP del Proxy.

HTTP_X-Forwarded-For siempre retorna Vacio.

Monday, February 11, 2008 7:25 PM
# Claudio said:

Si el cliente se conecta a travez de un proxy, lo que aparece en HTTP_X-Forwarded-For puede ser nada o una lista de direcciones IPs dependiendo de por cuantos proxies ha pasado el cliente.

Mira este articulo que esta muy bueno. Es para PHP, pero los conceptos son los mismos.

www.eslomas.com/.../obtencion-ip-real-php

Friday, August 15, 2008 3:29 PM
# Jonatan said:

NO FUNCIONA

Wednesday, August 25, 2010 6:03 PM
# daniel said:

perfecto, probado en internet explorar e IIS... muchas gracias

Wednesday, March 23, 2011 1:52 PM