Мы должны Request.UserHostAddress
получить IP-адрес в ASP.NET, но обычно это IP-адрес интернет-провайдера пользователя, а не IP-адрес компьютера пользователя, который, например, щелкнул ссылку. Как я могу получить реальный IP-адрес?
Например, в профиле пользователя Stack Overflow это: «Последняя активность учетной записи: 4 часа назад с 86.123.127.8» , но IP-адрес моей машины немного отличается. Как Stack Overflow получает этот адрес?
В некоторых веб-системах для некоторых целей выполняется проверка IP-адреса. Например, с определенным IP-адресом, может ли пользователь каждые 5 часов нажимать на ссылки для скачивания всего 5 раз? Этот IP-адрес должен быть уникальным, а не для интернет-провайдера, который имеет огромный круг клиентов или пользователей Интернета.
Я хорошо понял?
источник
Ответы:
Как говорили другие, вы не можете делать то, что просите. Если вы опишите проблему, которую пытаетесь решить, может, кто-то может помочь?
Например
редактироватьАдрес, который вы видите на сервере, не должен быть адресом интернет-провайдера, поскольку вы говорите, что это будет огромный диапазон. Адрес домашнего пользователя в широкополосной сети будет адресом их маршрутизатора, поэтому каждое устройство в доме будет выглядеть одинаково снаружи, но маршрутизатор использует NAT для обеспечения правильной маршрутизации трафика на каждое устройство. Для пользователей, получающих доступ из офисной среды, адрес может быть одинаковым для всех пользователей. Сайты, использующие IP-адрес для идентификации, рискуют ошибиться - приведенные вами примеры являются хорошими, и они часто терпят неудачу. Например, мой офис находится в Великобритании, точка прорыва (где я «появляюсь» в Интернете) находится в другой стране, где находится наше основное ИТ-подразделение, поэтому из моего офиса мой IP-адрес находится не в Великобритании. По этой причине я не могу получить доступ только к веб-контенту в Великобритании, такой как BBC iPlayer). В любой момент времени в моей компании находились сотни или даже тысячи людей, которые, по-видимому, имеют доступ к Интернету с одного и того же IP-адреса.
Когда вы пишете код сервера, вы никогда не можете быть уверены, на какой IP-адрес вы ссылаетесь. Некоторым пользователям это нравится. Некоторые люди намеренно используют прокси или VPN, чтобы еще больше вас запутать.
Когда вы говорите, что ваш машинный адрес отличается от IP-адреса, указанного в StackOverflow, как вы узнаете свой машинный адрес? Если вы просто используете локально
ipconfig
или что-то в этом роде, я ожидаю, что оно будет другим по причинам, которые я изложил выше. Если вы хотите дважды проверить, что думает внешний мир, взгляните на whatismyipaddress.com/ .Эта ссылка на Википедию по NAT предоставит вам некоторую информацию об этом.
источник
Часто вам захочется узнать IP-адрес того, кто посещает ваш сайт. Хотя в ASP.NET есть несколько способов сделать это, один из лучших способов, которые мы видели, это использование HTTP_X_FORWARDED_FOR из коллекции ServerVariables.
Вот почему ...
Иногда ваши посетители находятся за прокси-сервером или маршрутизатором, и стандарт
Request.UserHostAddress
фиксирует только IP-адрес прокси-сервера или маршрутизатора. В этом случае IP-адрес пользователя сохраняется в переменной сервера («HTTP_X_FORWARDED_FOR»).Итак, что мы хотим сделать, это сначала проверить «HTTP_X_FORWARDED_FOR», и если он пуст, мы просто возвращаемся
ServerVariables("REMOTE_ADDR")
.Хотя этот метод не является надежным, он может привести к лучшим результатам. Ниже приведен код ASP.NET в VB.NET, взятый из сообщения в блоге Джеймса Кроули «Получил: HTTP_X_FORWARDED_FOR возвращает несколько IP-адресов»
C #
VB.NET
источник
what we actually needed to be doing was take the last IP address
но ваш код получает первымaddresses[0]
. Что правильно?addresses.Length != 0
не обязательно, так как никогда не может быть 0.ОБНОВЛЕНИЕ: Спасибо Бруно Лопесу. Если несколько IP-адресов может прийти, то нужно использовать этот метод:
источник
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Если это C # см. Это очень просто
источник
Что еще вы считаете IP-адресом пользователя? Если вам нужен IP-адрес сетевого адаптера, я боюсь, что в веб-приложении это невозможно. Если ваш пользователь находится за NAT или другими вещами, вы также не можете получить IP.
Обновление : хотя существуют веб-сайты, которые используют IP для ограничения пользователей (например, rapidshare), они не работают правильно в средах NAT.
источник
Я думаю, что я должен поделиться своим опытом со всеми вами. Ну, я вижу в некоторых ситуациях REMOTE_ADDR НЕ даст вам то, что вы ищете. Например, если за сценой стоит балансировщик нагрузки и вы пытаетесь получить IP-адрес клиента, у вас будут проблемы. Я проверил это с помощью своего программного обеспечения для маскировки IP-адресов, а также проверил, что мои коллеги находятся на разных континентах. Итак, вот мое решение.
Когда я хочу узнать IP-адрес клиента, я стараюсь выбрать все возможные доказательства, чтобы определить, являются ли они уникальными:
Здесь я нашел другой сервер-var, который мог бы помочь вам всем, если вы хотите получить точный IP-адрес клиентской стороны. поэтому я использую: HTTP_X_CLUSTER_CLIENT_IP
HTTP_X_CLUSTER_CLIENT_IP всегда получает точный IP-адрес клиента. В любом случае, если оно не дает вам значения, вам следует искать HTTP_X_FORWARDED_FOR, поскольку это второй лучший кандидат для получения IP- адреса клиента, а затем переменная REMOTE_ADDR, которая может возвращать или не возвращать вам IP-адрес, но у меня есть все эти три - это то, что я считаю лучшим, чтобы следить за ними.
Я надеюсь, что это помогает некоторым парням.
источник
Ты можешь использовать:
источник
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
IP-адреса являются частью сетевого уровня в «семислойном стеке». Сетевой уровень может делать все, что хочет с IP-адресом. Вот что происходит с прокси-сервером, NAT, реле или чем-то еще.
Уровень приложений никоим образом не должен зависеть от IP-адреса. В частности, IP-адрес не должен быть идентификатором чего-либо, кроме идентификатора одного конца сетевого соединения. Как только соединение закрыто, вы должны ожидать изменения IP-адреса (того же пользователя).
источник
Все ответы до сих пор учитывают нестандартный, но очень распространенный
X-Forwarded-For
заголовок. Существует стандартизированныйForwarded
заголовок, который немного сложнее разобрать. Вот некоторые примеры:Я написал класс, который учитывает оба этих заголовка при определении IP-адреса клиента.
Ниже приведены некоторые модульные тесты, которые я использовал для проверки своего решения:
источник
Если вы используете CloudFlare, вы можете попробовать этот метод расширения :
тогда
источник
источник
То, что вы можете сделать, это сохранить IP-адрес маршрутизатора вашего пользователя, а также переадресованный IP-адрес и попытаться сделать его надежным, используя как IP-адреса [External Public, так и Internal Private]. Но через несколько дней клиенту может быть назначен новый внутренний IP-адрес от маршрутизатора, но он будет более надежным.
источник
Комбинируя ответы от @Tony и @mangokun , я создал следующий метод расширения:
источник
HTTP_X_FORWARDED_FOR
но нетX_FORWARDED_FOR
? Они одинаковы?использовать в файле Ashx
источник
Используйте;
источник
Это легко. Попробуйте это:
Просто это :))
источник
Привет, ребята. Большинство кодов, которые вы найдете, будут возвращать вам IP-адрес сервера, а не IP-адрес клиента. Однако этот код возвращает правильный IP-адрес клиента. Попробуйте. Для получения дополнительной информации просто проверьте это
https://www.youtube.com/watch?v=Nkf37DsxYjI
для получения вашего локального IP-адреса с помощью JavaScript вы можете использовать этот код внутри тега скрипта
и для получения вашего публичного IP-адреса вы можете использовать этот код внутри тега скрипта
источник
использовать этот
источник
Пытаться:
источник