Есть ли способ ограничить доступ к веб-службе ASMX, то есть к странице asmx и ее WSDL? - PullRequest
15 голосов
/ 09 сентября 2009

У меня есть веб-служба C # .net, к которой мне нужно ограничить доступ. Я уже требую, чтобы мои потребители использовали имя пользователя и пароль для вызова службы. Но есть ли способ ограничить доступ к реальной странице asmx и WSDL? Мне нужно было бы ограничить доступ к веб-сервису по имени пользователя / паролю и IP-адресу. Если бы у пользователя не было правильных учетных данных, я бы не хотел, чтобы он знал, какие веб-методы существуют в веб-сервисе.

Можно ли это сделать через IIS? Я знаю, что могу ограничивать IP-адреса через IIS, но могу ли я также использовать имена пользователей / пароли?

Есть ли другой способ сделать это вне IIS, возможно, с использованием C # .net?

Ответы [ 6 ]

38 голосов
/ 25 октября 2009

Что ж, поскольку это ASMX, у вас есть весь стек времени выполнения ASP.NET.

Шаг # 1 - управление ресурсом через .config

Примените тег <location> для ресурсов, которые вы хотите защитить. Предполагая, что это один файл ASMX, вы можете просто сделать следующее в вашем файле web.config:

<location path="MyWebService.asmx">
    <system.web>
        <!-- resource specific options will go here -->
    </system.web>
</location>

Шаг № 2 - аутентификация ваших пользователей

Вам нужно решить, как вы собираетесь аутентифицировать пользователей. Есть несколько способов сделать это и несколько стандартов аутентификации, которые вы можете использовать. Вам нужно выбрать подход, который подходит именно вам.

Если вы находитесь в интрасети и используете проверку подлинности Windows, я настоятельно рекомендую использовать это, потому что это действительно самый простой вариант настройки. Однако, если к вашим услугам обращаются через Интернет, проверка подлинности Windows на самом деле не вариант, и вам нужно выбрать веб-стандарт. Самым простым из них является Basic Authentication , но вы должны only использовать это через SSL, так как имя пользователя / пароль не зашифрованы (только в кодировке base64). Следующий шаг после этого - Дайджест-аутентификация , который не требует SSL, потому что имя пользователя / пароль отправляются с использованием хеша MD5. В конечном итоге вы можете воспользоваться SSL v3 , где вы выдаете определенный клиентский сертификат каждому пользователю вашего API.

Теперь, какой параметр вы выбираете для безопасности, диктует, что еще нужно сделать. Если вы выбираете безопасность Windows, это так же просто, как добавить следующий элемент к элементу <system.web>, с которого мы начали на шаге 1:

<authentication mode="Windows" />

Остальные протоколы безопасности потребуют немного больше работы. ASP.NET не обеспечивает встроенную поддержку Basic, Digest или SSL v3. Технически вы можете использовать IIS для выполнения такого типа аутентификации, но он всегда будет привязан к пользователю Windows. Если это вариант для вас, просто оставьте элемент <authentication mode="Windows" /> и настройте IIS соответствующим образом. Однако, если это не вариант, либо из-за того, что вы просто не можете контролировать IIS / ActiveDirectory, либо вам необходимо проходить аутентификацию в пользовательской базе данных, то это означает, что вам нужно подключить пользовательский модуль HttpModule для обеспечения поддержки этой безопасности. протоколы.

Шаг № 3 - защита ресурса

Самый простой подход к обеспечению безопасности ресурса заключается в том, чтобы сказать: «не позволяйте никому, кто каким-либо образом не прошел аутентификацию, войти в этот ресурс». Это делается с использованием следующей конфигурации авторизации:

<authorization>
    <deny users="?" />
</authorization>

Если вы хотите разрешить только определенным пользователям, вы можете вместо этого сделать следующее:

<authorization>
    <deny users="*" />
    <allow users="jdoe, msmith" />
</authorization>

Другой подход заключается в определении ролей (групп) и просто привязке ресурса к специальной роли, в которую вы помещаете пользователей, к которым вы хотите получить доступ к ресурсу.

<authorization>
    <deny users="*" />
    <allow roles="My Service Users" />
</authorization>

Это хорошо сопоставляется с проверкой подлинности Windows, поскольку вы можете просто настроить группу Windows и позволить своей группе MIS управлять пользователями, входящими в эту группу, с помощью ActiveDirectory. Тем не менее, эта функция также отлично работает для аутентификации не-Windows, при условии, что используемая реализация безопасности раскрывает роли через реализацию IPrincipal.

0 голосов
/ 07 июля 2016

Добавить <add path="*.asmx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /> в раздел <httpHandlers> файла web.config

0 голосов
/ 22 октября 2009

Вы можете аутентифицироваться, используя HttpModule. SSL + BasicAuthentication должна обеспечить лучшее взаимодействие с другими цепями инструментов.

В HttpModule у вас есть доступ к запросу и вы можете запретить неаутентифицированным пользователям доступ только к .asmx запросам. И даже тогда вы можете позволить им получить доступ к WSDL.

0 голосов
/ 22 октября 2009

Два варианта: создать совершенно другой сайт на другом порту с заблокированными разрешениями. Это имеет то преимущество, что обеспечивает некоторую степень «безопасности через неясность» (наполовину шутки ...) Или вы можете добавить новое приложение под своим сайтом (тот же порт, другой путь), в другой пул приложений и назначить разрешения таким образом.

В любом случае ваш веб-сервис не сможет взаимодействовать с различными «вещами» ASP.NET, такими как объект приложения (да, будет, но не так). Развертывание только немного сложнее: разверните те же двоичные файлы, но включите только один файл веб-службы.

0 голосов
/ 21 октября 2009

Я не знаю, насколько это практично для вас, но вы могли бы подумать о переходе на WCF. WCF полностью обратно совместим с веб-сервисами ASMX и позволяет вам контролировать, будет ли WSDL открыт, путем определения конечной точки MEX (обмена метаданными). Нет конечной точки MEX, нет WSDL.

0 голосов
/ 09 сентября 2009

Вы можете остановить отображение WSDL, удалив протокол Documentation из элемента в Machine.config

Обновление: Аутентификация веб-сервисов - лучшие практики? Если у ваших пользователей есть имена пользователей и пароли, вы можете использовать базовую аутентификацию HTTP через HTTPS.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...