2010-04-12 7 views

Répondre

20

HttpContext.Current.Request.UserHostAddress;

ou

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

ou

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

+3

Quel est le différent entre les deux premières alternatives? –

2

Request.UserHostAddress

25

Edit: a également trouvé une question intéressante concernant les en-têtes http IP-connexes here. Comme mentionné dans les commentaires et dans le lien ci-dessus, HTTP_X_FORWARDED_FOR peut contenir plusieurs adresses IP séparées par une virgule. Je n'ai pas fait face à cette situation, mais supposons que certaines corrections soient nécessaires.

J'utiliser ce code pour obtenir l'adresse IP (il renvoie la valeur IPAddress.None si jamais on obtient échoué pour une raison):

/// <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 pour renvoyer en tant qu'objet IPAddress –

+4

Sachez que l'en-tête 'X-Forwarded-For' peut être falsifié, ne prenez donc aucune décision de sécurité en fonction de ce dernier. Vérifiez uniquement la valeur 'HTTP_X_FORWARDED_FOR' si la machine se trouve derrière un équilibreur de charge ou un proxy inverse. – devstuff

+2

Sachez également que HTTP_X_FORWARDED_FOR contiendra plusieurs adresses IP si plusieurs proxys sont transmis. Est-ce que la méthode Parse gère cela correctement? – 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; 
} 

d'abord essayer de trouver proxy IP, si son null nous pouvons obtenir que la propriété intellectuelle du système

0

Essayez ceci pour obtenir l'adresse IP externe de l'utilisateur ..

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; } 
    }