Как запретить другим пользователям добавлять ссылку на службу размещенной службы wcf?
-
12-09-2019 - |
Вопрос
Если я размещаю службу WCF, чтобы кто-то (то есть кто-то, кого я знаю) мог использовать мою службу, но что, если кто-то другой (то есть кто-то, кого я не знаю) использует ее, тогда сделал бы это я?Как мне предотвратить это?Как этого можно достичь?
Можно ли это сделать с помощью регулирования сервиса или каковы другие способы достижения этой цели?
Решение
Нет, в WCF нет механизма, позволяющего определенным клиентам использовать ваш сервис и запрещающего другим.Вам нужно подойти к этому вопросу под другим углом.
Один из способов - не публиковать автоматически ваши метаданные из вашего сервиса, напримерсделайте его почти "невидимым" - а затем распространите необходимую информацию метаданных в виде одного или нескольких WSDL и одного или нескольких XSD-файлов среди тех клиентов, которых вы хотите подключить к своему сервису.Если ваши метаданные недоступны, кто-то, просто просматривающий ваш сервисный адрес, не получит никакой информации о том, куда звонить.
Обмен метаданными контролируется <serviceMetadata>
поведение, а также наличие конечной точки "mex" в вашем сервисе.Удалите и то, и другое, и ваш сервис станет невидимым.
Другим способом было бы запретить любым внешним пользователям доступ к вашему серверу WCF на основе брандмауэров и сетевых правил.Это не может быть сделано WCF, но ваш сетевой администратор может ограничить, какие IP-адреса имеют физический доступ к компьютеру, на котором запущена ваша служба WCF.
Марк
Обновить:
Чтобы отправить метаданные тем пользователям, которые должны иметь возможность обращаться в вашу службу, вы можете сделать одно из двух:
1) Использование svcutil.exe /t:metadata (path+name of your service assembly)
, вы можете извлечь метаданные из вашей сервисной сборки (например, MyServiceLibrary.dll
).Это даст вам один или несколько файлов WSDL и один или несколько файлов XSD, которые вам необходимо отправить вашим предполагаемым пользователям.Они могут поместить эти файлы куда-нибудь на свой жесткий диск, а затем в "Добавить ссылку на службу" вместо ввода URL-адреса для поиска службы они могут ввести имя основного WSDL (который импортирует все остальные файлы), и они получат свой клиентский прокси.
Или:
2) Когда служба запущена, вы можете "Добавить новый проект" в свое решение, выбрать библиотеку классов (MyService.Client
), затем выполните команду "Добавить ссылку на службу" и введите URL-адрес вашей службы.Это создаст все необходимые файлы и все остальное в вашей новой библиотеке классов.Скомпилируйте эту библиотеку классов и отправьте эту сборку MyService.Client.dll
пользователям, которым вы хотите разрешить доступ к вашему сервису.
В обоих решениях вам не нужно включать обмен метаданными, и кто-то другой не может просто подойти к вашему сервису и получить всю информацию, необходимую для того, чтобы вызвать его.
Другие советы
Если вы хотите, чтобы некоторые клиенты могли использовать (или просматривать) вашу службу, а некоторым клиентам не разрешалось использовать (или просматривать) вашу службу, вам необходимо настроить аутентификацию в вашей службе, чтобы только клиенты, которым вы разрешаете, могли получать доступ (или просматривать) вашу службу.
Я не знаю всего вашего сценария, но безопасности транспорта с базовой аутентификацией, вероятно, будет достаточно.Чтобы включить отключение анонимного доступа в IIS, настройте IIS на использование базовой авторизации, а затем в наборе конфигурации привязки:
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
Установите привязку mex таким образом, чтобы использовать безопасную привязку вместо привязки mexHttpBinding по умолчанию.Вам также понадобится SSL-сертификат для вашего сайта (если вы используете wsHttpBinding).
Обновить:Вот пример, Пользовательская Защищенная Конечная точка метаданных это демонстрирует, как реализовать службу с защищенной конечной точкой метаданных.