2017-07-10 44 views
5

Tôi đang cố gắng để có được địa chỉ IP của người dùng từ ASP.NET MVC 5. Tôi đã nhìn lên những ví dụ khác nhau, chẳng hạn như những:địa chỉ khách hàng chỉ IP trả về cùng một địa chỉ mạng nội bộ

Họ đã sản xuất tất cả các kết quả tương tự: người dùng được xem nội mạng. Tôi đã có bạn bè thử điện thoại của họ (không có trên mạng). Đây là nỗ lực mới nhất của tôi:

private static Logger _logger = LogManager.GetCurrentClassLogger(); 
public static bool IsIpInternal() 
{ 
    var ipAddress = HttpContext.Current.Request.UserHostAddress; 
    var logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, ipAddress); 
    _logger.Log(logEvent); 
    try 
    { 
     if (ipAddress != null) 
     { 
      var ipParts = ipAddress.Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries) 
       .Select(int.Parse).ToArray(); 
      var isDebug = System.Diagnostics.Debugger.IsAttached; 

      if (ipParts[0] == 10) 
      { 
       return true; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     logEvent = new LogEventInfo(LogLevel.Error, _logger.Name, e.Message); 
     _logger.Log(logEvent); 
     return false; 
    } 
    return false; 
} 

Nhật ký hiển thị 10.xxx.xx.xxx cho tất cả yêu cầu (dựa trên nhật ký). Đây là địa chỉ nội bộ thay vì IP của ứng dụng khách kết nối với ứng dụng web. Các IsIpInternal() trả về đúng luôn. Tôi đang làm gì sai?

Lưu ý rằng tôi bỏ qua các địa chỉ 192.168.x.x172.16.xxx.xxx là nội bộ.

+1

Trang web của bạn có nằm sau proxy hoặc trình cân bằng tải không? –

+0

@JohnWu, vâng, chúng tôi có một Citrix NetScaler mà tất cả các máy chủ của chúng tôi sử dụng. Có thể loại bỏ địa chỉ IP ban đầu không? – Alex

Trả lời

6

Nếu trang web của bạn nằm phía sau trình cân bằng tải, đó là vấn đề phổ biến cho địa chỉ IP của trình cân bằng tải xuất hiện khi bạn đang mong đợi địa chỉ IP của máy khách. Đó là bởi vì trong thực tế, cân bằng tải là ứng dụng duy nhất mà ứng dụng web biết đang nói chuyện với nó.

Có hai cách để đối phó với điều này:

  1. Bạn có thể cấu hình cân bằng tải để thêm một tiêu đề HTTP bổ sung (x-forwarded-for) mà xác định địa chỉ IP gốc. Bạn sẽ cần phải sửa đổi trang web của bạn để nhìn vào tiêu đề này thay vì UserHostAddress, như thế này:

    //var clientIP = HttpContext.Current.Request.UserHostAddress; 
    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"]; 
    

    Lưu ý: Tiêu đề x-chuyển-cho thực sự có thể return a comma-delimited list of IP addresses trong một số trường hợp. Vì vậy, để phù hợp với một điều xảy ra như vậy, bạn có thể viết những dòng này thay vì:

    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"].Split(',')[0]; 
    
  2. Bạn có thể cấu hình lbs nhất định để đi qua IP client bằng cách sao chép các gói tin IP header. Đối với Netserer Citrix, xem this article để biết thêm thông tin.

+0

Cảm ơn, @JohnWu. Quản trị viên sys đã thêm tiêu đề vào Netscaler và bây giờ nó hoạt động như một sự quyến rũ! – Alex

+1

Tuyệt vời! Cảm ơn bạn đã xác nhận rằng nó đã hoạt động. Chúng ta thường làm tùy chọn # 1. –

+0

Yup, sử dụng tùy chọn đó và đọc nó qua 'HttpContext.Current.Request.Headers [" x-forwarded-for "]' – Alex

Các vấn đề liên quan