Después de de esta extensa compilación de información pudimos resolver este atascamiento que tienen algunos usuarios. Te dejamos la respuesta y nuestro objetivo es resultarte de mucha apoyo.
Solución:
A menudo querrá saber la dirección IP de alguien que visite 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é…
A 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. Cuando este es el 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 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 de blog de James Crowley “Gotcha: HTTP_X_FORWARDED_FOR devuelve múltiples direcciones IP”
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
Como otros han dicho, no puedes hacer lo que estás pidiendo. Si describe el problema que está tratando de resolver, ¿quizás alguien pueda ayudar?
P.ej
- ¿Está tratando de identificar de forma única a sus usuarios?
- ¿Podría usar una cookie, o quizás la ID de sesión en lugar de la dirección IP?
Editar La dirección que ve en el servidor no debería 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 enruta a cada dispositivo correctamente. 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 la identificación corren el riesgo de equivocarse mucho: los ejemplos que brinda son buenos y, a menudo, 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 se encuentra nuestra principal instalación de TI, por lo que desde mi oficina mi dirección IP parece no estar en el Reino Unido. Por esta razón, no puedo acceder al contenido web solo del Reino Unido, como BBC iPlayer). En un momento dado, 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 está escribiendo el código del 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 está averiguando la dirección de su máquina? Si solo está buscando localmente usando 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 sobre NAT le proporcionará algunos antecedentes al respecto.
ACTUALIZAR:
Gracias a Bruno Lopes. Si pueden venir varias direcciones IP, entonces necesita 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"];