2010-04-12 74 views

Trả lời

20

HttpContext.Current.Request.UserHostAddress;

hoặc

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

hoặc

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

+3

là gì khác nhau ence giữa hai lựa chọn thay thế đầu tiên? –

2

Request.UserHostAddress

25

Edit: cũng tìm thấy một câu hỏi thú vị về tiêu đề http liên quan đến IP here.

Chỉnh sửa2: Như đã đề cập trong nhận xét và liên kết tôi đã cung cấp ở trên, tiêu đề HTTP_X_FORWARDED_FOR có thể chứa nhiều địa chỉ IP được phân tách bằng dấu phẩy. Tôi đã không phải đối mặt với tình trạng này nhưng giả sử một số sửa chữa cho câu trả lời của tôi là bắt buộc.

tôi sử dụng mã này để có được địa chỉ IP (nó trả IPAddress.None giá trị nếu bị thất bại vì một lý do):

/// <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 để quay trở lại làm đối tượng IPAddress –

+4

Lưu ý rằng tiêu đề 'X-Forwarded-For' có thể được giả mạo, do đó, không đưa ra bất kỳ quyết định bảo mật nào dựa trên nó. Chỉ kiểm tra giá trị 'HTTP_X_FORWARDED_FOR' nếu máy nằm phía sau bộ cân bằng tải hoặc proxy ngược. – devstuff

+2

Cũng lưu ý rằng HTTP_X_FORWARDED_FOR sẽ chứa nhiều địa chỉ IP nếu nhiều proxy được chuyển. Phương thức Parse có xử lý đúng cách này không? – 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; 
} 

Đầu tiên cố gắng tìm ra proxy IP, nếu null của nó chúng ta có thể nhận được rằng hệ thống IP

0

Hãy thử điều này để có được địa chỉ IP bên ngoài của người sử dụng ..

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; } 
    } 
Các vấn đề liên quan