2017-07-10 258 views
5

我想從ASP.NET MVC 5.用戶的IP地址相同的內部網絡地址,我擡頭一看各種例子,像這樣的:客戶端IP地址返回

他們都產生相同的結果:用戶被視爲內部網絡。我有朋友試過他們的手機(這不在網絡上)。這裏是我的最新嘗試:

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

的日誌中顯示10.xxx.xx.xxx所有請求(基於日誌)。這是一個內部地址,而不是連接到Web應用程序的客戶端的IP地址。 IsIpInternal()總是返回true。我究竟做錯了什麼?

請注意,我忽略了192.168.x.x172.16.xxx.xxx地址爲內部地址。

+1

您的網站是代理還是負載均衡器? –

+0

@JohnWu,是的,我們有一臺Citrix NetScaler,所有服務器都使用它。那可以刪除原來的IP地址嗎? – Alex

回答

6

如果您的網站位於負載平衡器的後面,那麼當您期待客戶端的IP地址時,負載均衡器的IP地址就會出現。這是因爲實際上,負載均衡器是Web應用程序知道與之通信的唯一客戶端。

有兩種方法來解決這個問題:

  1. 您可以配置負載均衡器添加指定原始IP地址一個額外的HTTP標頭(x-forwarded-for)。您將需要修改你的網站看一下這個頭,而不是UserHostAddress,就像這樣:

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

    注:X轉發換頭其實也可以在某些情況下return a comma-delimited list of IP addresses。所以要與這樣的occurence兼容,你可以寫這樣的:

    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"].Split(',')[0]; 
    
  2. 您可以配置一定的LB通過複製IP頭包通過客戶端IP通過。有關Citrix Netscaler的更多信息,請參閱this article

+0

謝謝,@JohnWu。系統管理員在Netscaler中添加了標題,現在它就像一個魅力! – Alex

+1

太棒了!感謝您確認它的工作。我們通常選擇#1。 –

+0

是的,使用該選項並通過'HttpContext.Current.Request.Headers [「x-forwarded-for」]讀取它' – Alex