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 :-)