2009-12-15 30 views
45

Quiero obtener la dirección IP de quien se está registrando en mi sitio. Cómo hacer esto en ASPNET. He utilizado el siguiente código, pero, no está recibiendo la dirección IP correcta¿Cómo obtener la dirección IP?

string ipaddress = Request.UserHostAddress; 
+0

1. [http://www.w3schools.com/asp/coll_servervariables.asp](http://www .w3schools.com/asp/coll_servervariables.asp) 2. [http://balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/](http://. balanagaraj.wordpress.com/2008/01/07/get-users-country-name-using-ip-address/) – solairaja

+1

posible duplicado de [Cómo obtener la dirección IP del cliente de un usuario en ASP.NET?](http:/ /stackoverflow.com/questions/735350/how-to-get-a-users-client-ip-address-in-asp-net) –

Respuesta

54

Puede utilizar este método para obtener la dirección IP de la máquina cliente.

public static String GetIP() 
{ 
    String ip = 
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrEmpty(ip)) 
    { 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 

    return ip; 
} 
+1

Dividir HTTP_X_FORWARDED_FOR y seleccionar el último es mejor- ver respuesta http://stackoverflow.com/a/13249280/52277 –

+2

'X-Forwarded-For' puede contener varias direcciones IP. – Gabriel

3

Si un cliente se conecta a través de un proxy transparente no anónimo, puede obtener su dirección de:

Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 

que puede devolver null o "desconocido" si no se puede obtener la IP de esa manera.

Request.ServerVariables["REMOTE_ADDR"] debe ser el mismo que Request.UserHostAddress, cualquiera de los cuales se puede utilizar si la solicitud no es de un proxy no anónimo.

Sin embargo, si la solicitud proviene de un proxy anónimo, entonces no es posible obtener directamente la IP del cliente. Es por eso que llaman a esos proxies anónimo.

34

HTTP_X_FORWARDED_FOR se debe utilizar PERO puede devolver varias direcciones IP separadas por una coma. Ver this page.

Por lo tanto, siempre debe verificarlo. Yo personalmente uso la función Split.

public static String GetIPAddress() 
{ 
    String ip = 
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 

    if (string.IsNullOrEmpty(ip)) 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    else 
     ip = ip.Split(',')[0]; 

    return ip; 
} 
+17

Tendría cuidado con eso, está eligiendo el primer artículo que podría ser 192.168.x.x.Normalmente desea obtener el último porque ese es el último proxy o cliente que se conecta a su sistema (y probablemente la fuente más confiable). Ver [artículo de wikipedia] (http://en.wikipedia.org/wiki/X-Forwarded-For) El código que uso lo hace así: 'ip = (HttpContext.Request.ServerVariables [" HTTP_X_FORWARDED_FOR "] ??" ") .Split (','). Last(). Trim(); ' –

+4

@WouterSimons, según el mismo [artículo de Wikipedia] (https://en.wikipedia.org/wiki/X-Forwarded-For)" el del extremo izquierdo es el cliente original ", por lo que debe usarse First() en lugar de Last() –

33

En una situación donde utilice la dirección IP de seguridad, debe conocer su infraestructura.

Si está usando un proxy entre el servidor web y sus clientes que establece la cabecera, debe ser capaz de confiar en la última dirección. Luego, utiliza el código como Muhammed sugirió con una actualización para obtener siempre la última dirección IP del encabezado directo (Vea el código a continuación)

Si no usa un proxy, tenga en cuenta que el encabezado X-Forwarded-For es muy fácil de burlar. Le sugiero que lo ignore, a menos que tenga una razón clara para no hacerlo.

He actualizado el código de Muhammed Akhtar la siguiente manera para que pueda elegir:

public string GetIP(bool CheckForward = false) 
{ 
    string ip = null; 
    if (CheckForward) { 
     ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    } 

    if (string.IsNullOrEmpty(ip)) { 
     ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } else { // Using X-Forwarded-For last address 
     ip = ip.Split(',') 
       .Last() 
       .Trim(); 
    } 

    return ip; 
} 

Este Wikipedia article explica los riesgos más a fondo.

0
string result = string.Empty; 
    string ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
    if (!string.IsNullOrEmpty(ip)) 
    { 
     string[] ipRange = ip.Split(','); 
     int le = ipRange.Length - 1; 
     result = ipRange[0]; 
    } 
    else 
    { 
     result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 
+0

Agregue una explicación a su código (y mejore la sangría). ¡Esto mejoraría la calidad de tu respuesta! –

+0

Nunca usa esa variable 'le' - Supongo que quiere usar eso en lugar de' 0' en la línea siguiente –

4

En MVC 6, recuperar la dirección IP de esta manera:

HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString() 
Cuestiones relacionadas