2010-04-12 39 views

Respuesta

20

HttpContext.Current.Request.UserHostAddress;

o

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

o

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

+3

Cuál es el diferir entre las dos primeras alternativas? –

2

Request.UserHostAddress

25

Editar: también encontró una pregunta interesante con respecto a los encabezados http relacionados con la propiedad intelectual here.

Edit2: como se menciona en los comentarios y en enlace I proporcionada anteriormente, HTTP_X_FORWARDED_FOR cabecera puede contener múltiples direcciones IP separadas por comas. No me enfrenté a esta situación, pero supongamos que se requieren algunas correcciones a mi respuesta.

que utiliza este código para obtener la dirección IP (que vuelve IPAddress.None valor si conseguir fallado por alguna razón):

/// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// The <see cref="System.Net.IPAddress.None" /> value will be returned if getting is failed. 
    /// </remarks> 
    /// </summary> 
    /// <param name="request">The HTTP request object.</param> 
    /// <returns></returns> 
    public static IPAddress GetIp(this HttpRequest request) 
    { 
     string ipString; 
     if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
     { 
      ipString = request.ServerVariables["REMOTE_ADDR"]; 
     } 
     else 
     { 
      ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
       .FirstOrDefault(); 
     } 

     IPAddress result; 
     if (!IPAddress.TryParse(ipString, out result)) 
     { 
      result = IPAddress.None; 
     } 

     return result; 
    } 
+7

+1 para devolver como objeto IPAddress –

+4

Tenga en cuenta que el encabezado 'X-Forwarded-For' se puede falsificar, por lo que no tome ninguna decisión de seguridad basada en él. Solo verifique el valor 'HTTP_X_FORWARDED_FOR' si la máquina está detrás de un equilibrador de carga o proxy inverso. – devstuff

+2

También tenga en cuenta que HTTP_X_FORWARDED_FOR contendrá múltiples direcciones IP si se pasan varios proxies. ¿El método de Parse maneja esto correctamente? – Tomas

1
public String GetIP() 
{ 
    string ipString; 
    if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
    { 
     ipString = Request.ServerVariables["REMOTE_ADDR"]; 
    } 
    else 
    { 
     ipString = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
    } 
    return ipString; 
} 

En primer lugar tratar de averiguar IP del proxy, si es nula podemos conseguir IP del sistema que

0

Pruebe lo siguiente para obtener la dirección IP externa de usuario ..

public static string getExternalIp() 
    { 
     try 
     { 

      string externalIP; 
      externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/"); 
      externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) 
         .Matches(externalIP)[0].ToString(); 
      return externalIP; 
     } 
     catch { return null; } 
    } 
Cuestiones relacionadas