У меня есть веб-приложение, которое для внутренних пользователей должно вести себя иначе, чем для внешних. Веб-приложение доступно через Интернет, а значит, и для внутренних пользователей.
Все пользователи анонимны, не аутентифицированы, но страница должна отображаться для внутренних пользователей иначе, чем для внешних. В своем коде я использую Request.UserHostName, а затем Dns.GetHostEntry. Затем результат сравнивается с настройкой моего web.config (который содержит что-то вроде *.mydomain.local). Если сравнение дает положительный результат, я визуализирую HTML-код, который должен видеть внутренний пользователь, в противном случае я визуализирую HTML-код, который должен видеть внешний пользователь.
Однако моя проблема в том, что я не всегда получаю ожидаемое значение от Request.UserHostName. на сайте разработки я получаю IP-number (?) машины, на которой запущен браузер, но на сайте клиента я не получаю IP-number пользовательской машины, я получаю другой IP-number. В браузерах не установлены прокси-серверы или что-то в этом роде.
Должен ли я использовать что-то еще, кроме Request.UserHostName?





Может быть межсетевой экран, который выполняет своего рода NAT, чтобы позволить внутренним клиентам использовать внешнее DNS-имя для доступа к серверу.
Такой же IP-номер, который вы получаете на сайте клиента, на внешнем IP-адресе клиента-сервера? В этом случае вы можете жестко запрограммировать этот IP-адрес. Все внутренние компьютеры за этим брандмауэром будут иметь одинаковый IP-адрес, и вы можете классифицировать их как «внутренние».
Похоже, вам возвращают общедоступный IP-адрес. Заставьте пользователя перейти на http://www.myipaddress.com. Если это тот же IP-адрес, который возвращается вашему программному обеспечению, то это определенно так.
Единственное решение, которое я вижу, чтобы обойти это, - либо заставить их подключиться к машине, на которой установлено приложение asp.net, через VPN, либо использовать какой-либо другой вид аутентификации. Последний, наверное, лучший вариант.
Попробуйте Request.UserHostAddress, который возвращает IP-адрес клиента. Предполагая, что ваша внутренняя сеть использует IP-адреса, зарезервированные для локальных сетей, относительно просто проверить, является ли IP-адрес внутренним или внешним.
Похоже, что между пользователями и сервером на сайте клиента есть прокси-сервер (его не нужно настраивать в браузере). Это может быть внутренний или внешний прокси в зависимости от конфигурации вашей сети.
Я бы избегал использования UserHostName для того, что является эффективной аутентификацией, поскольку он предоставляется браузером во время запроса и его легко подделать. IP-адрес был бы намного более эффективным, поскольку трудно подменить IP-адрес в TCP / IP-соединении (и поддерживать соединение). Это все еще слабая аутентификация, но в этом случае может быть достаточно.
Даже если вы используете IP-адрес, если между клиентом и сервером есть NAT-прокси, вам, возможно, придется согласиться с тем, что все, что проходит через этот прокси-сервер, является доверенным (я предполагаю, что внешние / ненадежные клиенты не проходят через этот прокси).
Если это неприемлемо, вы вернетесь к другим методам аутентификации. Вместо того, чтобы требовать входа в систему или VPN-соединения, вы можете рассмотреть возможность использования постоянных файлов cookie или клиентских сертификатов и предоставлять их только внутренним клиентам, но вам понадобится какой-то способ доставки их клиенту. Вы, безусловно, можете доставить постоянный файл cookie на основе однократного входа в систему. Файлы cookie могут быть подделаны аналогичным образом в том смысле, что UserHostName может быть, однако у вас есть лучшая возможность создать значение cookie, которое менее предсказуемо, чем имя домена.
Я также рекомендую использовать IP-адреса. Я имею дело с той же ситуацией, настраивая систему аутентификации прямо сейчас, и условия, описанные Epso и Robin M, как раз и происходят. Внешние пользователи, приходящие на сайт, сообщают мне свой фактический IP-адрес, в то время как все внутренние пользователи предоставляют IP-адрес шлюзовой машины (маршрутизатора) в частной подсети, в которой находятся веб-серверы.
Чтобы разобраться с этим, я просто проверяю этот IP-адрес. Если я получаю IP шлюза, я предоставляю внутренний доступ. Если я получу что-нибудь еще, они получат внешний, который в моем случае требует дополнительной аутентификации. В вашем - это просто другой интерфейс.