2008-09-05 2 views
1

У меня есть веб-приложение, которое должно вести себя по-разному для внутренних пользователей, чем внешние. Веб-приложение доступно через Интернет, а следовательно, и для внутренних пользователей.Как получить IP-адрес браузера или имя хоста?

Все пользователи являются анонимными, а не аутентифицированными, но страница должна отображаться по-разному для внутренних пользователей, чем внешняя. То, что я делаю в своем коде, - Request.UserHostName, а затем Dns.GetHostEntry. Затем результат сравнивается с настройкой в ​​моем web.config (который содержит что-то вроде *.mydomain.local). Если сравнение дает положительный результат, я визуализирую HTML, который должен видеть внутренний пользователь. Я визуализирую HTML, который должен видеть внешний пользователь.

Однако моя проблема заключается в том, что я не всегда получаю ожидаемое значение от Request.UserHostName. на сайте разработки я получаю IP-number (?) машины, работающей в браузере, но на сайте клиента я не получаю IP-number пользовательской машины, я получаю некоторые другие IP-number. В браузерах нет каких-либо прокси-серверов или что-то в этом роде.

Должен ли я использовать что-то еще, кроме Request.UserHostName?

ответ

3

Я также рекомендую использовать IP-адреса. Я имею дело с такой же ситуацией, устанавливающей систему аутентификации прямо сейчас, и условия, описанные Epso и Robin M, - это именно то, что происходит. Внешние пользователи, приходящие на сайт, дают мне фактический IP-адрес, а все внутренние пользователи предоставляют IP-адрес шлюзовой машины (маршрутизатора) в частной подсети, на которой сидят веб-серверы.

Чтобы справиться с этим, я просто проверяю этот IP-адрес. Если я получу IP-адрес шлюза, я предоставляю внутренний доступ. Если я получу что-то еще, они получат внешний, который требует дополнительной аутентификации в моем случае. В вашем, это просто означает другой интерфейс.

0

Возможно, существует межсетевой экран, который выполняет какой-то NAT, чтобы внутренние клиенты могли использовать внешнее имя DNS для доступа к серверу.

Является ли IP-номер, который вы получаете на клиентском сайте, одинаково на внешнем ip-сервере клиента? В этом случае вы можете создать жесткий код для этого IP-адреса. Кажется, что все внутренние компьютеры этого брандмауэра имеют одинаковый ip-адрес, и вы можете классифицировать их как «внутренние».

0

Похоже, вам возвращается публичный IP адрес. Попросите пользователя перейти на http://www.myipaddress.com. Если это то же самое, что и IP-адрес, возвращаемый вашему программному обеспечению, это, безусловно, так.

Единственное решение, которое я вижу, чтобы обойти это, - либо подключить их к машине, использующей приложение asp.net через VPN, либо использовать какой-либо другой тип аутентификации. Последний, вероятно, лучший вариант.

2

Попробуйте Request.UserHostAddress, который возвращает IP-адрес клиента. Предполагая, что ваша внутренняя сеть использует IP-адреса, зарезервированные для локальных сетей, должно быть относительно просто проверить, является ли IP внутренним или внешним.

0

Похоже, что существует прокси-сервер между пользователями и сервером на сайте клиента (его не нужно настраивать в браузере). Это может быть внутренний или внешний прокси-сервер в зависимости от конфигурации вашей сети.

Я бы не использовал UserHostName для эффективной проверки подлинности, поскольку он представлен браузером, выполняющим запрос, и его легко подделать. IP-адрес будет намного более эффективным, так как трудно подделать IP-адрес в TCP/IP-соединении (и поддерживать соединение). Это по-прежнему слабая аутентификация, но может быть достаточно в этом сценарии.

Даже если вы используете IP-адрес, если есть прокси-сервер NAT между клиентом и сервером, возможно, вам придется признать, что все, что проходит через этот прокси, является надежным (я полагаю, что внешние/ненадежные клиенты не проходят через этот прокси).

Если это неприемлемо, вы вернетесь к другим методам аутентификации. Вместо того, чтобы требовать входа в систему или подключения к VPN, вы можете рассматривать постоянные файлы cookie или клиентские сертификаты и предоставлять их только внутренним клиентам, но вам нужно каким-то образом доставить их клиенту. Вы, безусловно, могли бы предоставить постоянный файл cookie, основанный на однократном входе в систему.Куки-файлы могут быть подделаны аналогичным образом, так как UserHostName может быть, однако, у вас есть лучшая возможность создать значение cookie, которое менее допустимо, чем имя домена.

Смежные вопросы