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
- https://stackoverflow.com/a/740431/177416
- https://stackoverflow.com/a/20194511/177416
- https://stackoverflow.com/a/3003254/177416
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.
Czy twoja strona internetowa znajduje się za proxy lub load balancera? –
@JohnWu, tak, mamy Citrix NetScaler, którego używają wszystkie nasze serwery. Czy to może być usunięcie oryginalnego adresu IP? – Alex