Мой вопрос касается наилучшего (так называемого "наименее болезненного" ) способа обеспечения доступа к службе 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-аутентификацию.
Затем я наткнулся на следующую цитату здесь, которая предлагает некоторые пояснения:
Вы не можете использовать auth. с потоковой передачей. Если вам нужно использовать потоки HTTP-запросов, вам придется работать без безопасности.
Способ обеспечения безопасности:
Клиент WCF делает HTTP-запрос для сервера.
Сервер отвечает тем, что говорит: "Вы не авторизованы, пришлите мне базовый/дайджест/etc."
Клиент получает этот ответ и отправляет свое сообщение с прикрепленными учетными данными.
Теперь сервер получает сообщение, проверяет учетные данные и продолжает. Поток запросов не предназначен для работы с этим шаблоном безопасности. Если бы это было так, это было бы очень медленно, так как Клиент отправил бы весь поток, получив сообщение от Сервера, что он не авторизовался, тогда ему придется повторно отправить весь поток с учетными данными.
Итак, теперь я ищу мнения, , как бы вы обеспечили поддержку службы WCF с поддержкой потоковой передачи? Как уже упоминалось ранее, предпочтительным будет какой-то механизм имени пользователя и пароля. Не стесняйтесь думать вне коробки на этом...
Любая помощь значительно оценена!