Мой вопрос касается лучшего (иначе называемого «наименее болезненного») способа обеспечения доступа к службе WCF, доступной только внутренним пользователям нашей компании. Цель состоит в том, чтобы обеспечить доступ к службе только через одно приложение форм Windows, которое установил каждый из наших пользователей. Когда служба вызывается, я хочу, чтобы служба могла проверить, вызвана ли она из разрешенного приложения.
Защищаемый сервис использует basicHttpBinding, который поддерживает потоковую передачу, поэтому я считаю, что я ограничен безопасностью транспортного уровня.
Ниже приведены упрощенные версии разделов <bindings>
и <services>
из файла конфигурации моей службы.
<bindings>
<basicHttpBinding>
<binding name="Service1Binding" transferMode="Streamed"/>
</basicHttpBinding>
</bindings>
<services>
<service name="WCFServiceSecurity.Service1"
behaviorConfiguration="WCFServiceSecurity.Service1Behavior">
<endpoint address=""
binding="basicHttpBinding"
contract="WCFServiceSecurity.IService1"
bindingConfiguration="Service1Binding"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
Может ли кто-нибудь предложить некоторые подробности относительно того, какие действия мне необходимо предпринять для обеспечения безопасности в этой службе?
Примечание: я новичок в WCF и совсем не знаком с безопасностью, поэтому дайте мне знать, если я не предоставил достаточно подробностей.
UPDATE:
Как и , предложенный marc_s , я бы хотел защитить службу WCF, используя какой-то механизм имени пользователя / пароля. Это дает немного больше направления к ответу, но я все еще немного размыт на , как фактически сделать это.
Поскольку мой сервис требует, чтобы потоковая передача была включена, я должен использовать basicHttpBinding и безопасность транспортного уровня (верно?); Кроме того, метод, содержащийся в моем сервисе, может принимать только объект Stream.
С учетом этих ограничений и моего предпочтения использовать проверку имени пользователя / пароля ...
- Как мне изменить конфигурационный файл моей службы так, чтобы вводить учетные данные для имени пользователя / пароля?
- Как мой сервис проверит предоставленные учетные данные?
- Как мое клиентское приложение будет передавать учетные данные службе при совершении вызова?
- Требуется ли для этого использование SSL, и если да, то все ли клиентские машины также требуют сертификат?
UPDATE:
После объяснения проблемы, с которой я столкнулся при обеспечении этой службы своему боссу, мне дали разрешение попробовать маршрут аутентификации Windows. К сожалению, мне не повезло в реализации этого типа аутентификации с моей службой Streamed (argh) После внесения соответствующих изменений (как указано здесь - единственное исключение, что мой transferMode="Streamed"
) и доступа к моему сервису, я получил следующую ошибку:
Потоковая передача HTTP-запроса не может использоваться в сочетании с аутентификацией HTTP. Отключите потоковую передачу запросов или укажите анонимную HTTP-аутентификацию.
Затем я наткнулся на следующую цитату здесь , которая предлагает некоторые пояснения:
Вы не можете выполнять авторизацию транспорта. с потоковой передачей. Если вам нужно использовать потоковую передачу HTTP-запросов, вам придется работать без защиты.
Как работает система безопасности:
Клиент WCF отправляет http-запрос на сервер.
Сервер отвечает что-то вроде: «Вы не авторизованы, пришлите мне базовые / digest / etc учетные данные».
Клиент получает этот ответ и повторно отправляет свое сообщение с прикрепленными учетными данными.
Теперь Сервер получает сообщение, проверяет учетные данные и продолжает работу.
Поток запросов не предназначен для работы с этим шаблоном безопасности. Если это произойдет, это будет очень медленно, так как Клиент отправит весь поток, получит сообщение с Сервера, что он не авторизован, тогда ему придется повторно отправить весь поток с учетными данными.
Так что теперь я ищу мнения, как бы вы защитили службу WCF с поддержкой потоковой передачи? Как упоминалось ранее, предпочтительнее использовать какой-либо механизм имени пользователя / пароля. Не стесняйтесь мыслить нестандартно на этом ...
Любая помощь очень приветствуется!