Есть ли способ ограничить доступ к веб-сервису ASMX, т.е.страница asmx и ее WSDL?

StackOverflow https://stackoverflow.com/questions/1400198

Вопрос

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

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

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

Это было полезно?

Решение

Ну, поскольку это 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 на самом деле не вариант, и вам нужно выбрать веб-стандарт. Простейшим из них является базовая аутентификация , но вы должны только использовать это через 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.

Другие советы

Два варианта: создать совершенно другой сайт на другом порту с заблокированными разрешениями. Преимущество этого заключается в предоставлении некоторого количества & Безопасности через скрытность & Quot; (наполовину в шутку ...) Или вы можете добавить новое приложение под своим сайтом (тот же порт, другой путь), в другой пул приложений и назначить разрешения таким образом.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top