2017-07-10 21 views
5

Próbuję uzyskać adres IP użytkownika z ASP.NET MVC 5. Przyjrzeliśmy się różne przykłady, takie jak te:adres IP Klient zwraca ten sam wewnętrzny adres sieciowy

oni wszyscy wyprodukował sam wynik: użytkownik jest uważany wewnętrzny do sieci. Mam znajomych, którzy próbują swoich telefonów (których nie ma w sieci). Oto moja najnowsza próba:

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

Log pokazuje 10.xxx.xx.xxx dla wszystkich wniosków (na podstawie dziennika). Jest to adres wewnętrzny, a nie adres IP klienta łączącego się z aplikacją internetową. IsIpInternal() zawsze zwraca wartość true. Co ja robię źle?

Należy pamiętać, że ignoruję adresy 192.168.x.x i 172.16.xxx.xxx jako wewnętrzne.

+1

Czy twoja strona internetowa znajduje się za proxy lub load balancera? –

+0

@JohnWu, tak, mamy Citrix NetScaler, którego używają wszystkie nasze serwery. Czy to może być usunięcie oryginalnego adresu IP? – Alex

Odpowiedz

6

Jeśli Twoja strona internetowa znajduje się za modułem wyrównywania obciążenia, często pojawia się problem z adresem IP modułu równoważenia obciążenia, który pojawia się, gdy spodziewasz się adresu IP klienta. Dzieje się tak, ponieważ w rzeczywistości system równoważenia obciążenia jest jedynym klientem, o którym wie aplikacja internetowa.

Istnieją dwa sposoby radzenia sobie z tym:

  1. można skonfigurować równoważenia obciążenia, aby dodać dodatkowy nagłówek HTTP (x-forwarded-for), który określa oryginalny adres IP. trzeba będzie zmodyfikować swoją stronę internetową, aby spojrzeć na ten cel zamiast UserHostAddress, tak:

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

    Uwaga: X-przekazane-dla nagłówka może faktycznie return a comma-delimited list of IP addresses w niektórych przypadkach. Więc być zgodne z takiego wystąpienia, można napisać to zamiast:

    var clientIP = HttpContext.Current.Request.Headers["x-forwarded-for"].Split(',')[0]; 
    
  2. Można skonfigurować pewne lbs przejść przez IP klienta poprzez skopiowanie pakietu nagłówka IP. W przypadku Citrix Netscaler, aby uzyskać więcej informacji, patrz this article.

+0

Dzięki, @JohnWu. Administrator sys dodał nagłówek w Netscaler, a teraz działa jak urok! – Alex

+1

Świetnie! Dziękuję za potwierdzenie, że zadziałało. Zazwyczaj robimy opcję nr 1. –

+0

Yup, używając tej opcji i czytając ją poprzez 'HttpContext.Current.Request.Headers [" x-forwarded-for "]' – Alex

Powiązane problemy