Как настроить безопасность при вызове службы WCF из клиента .Net 2.0

У меня запущена и работает служба WCF, и я могу обмениваться данными между службой и клиентом .Net 2.0 с помощью basicHttpBinding.

Теперь мне нужно заблокировать службу WCF, чтобы ее могли вызывать только аутентифицированные клиенты.

Я контролирую клиентов, которые будут звонить в мою службу. Клиенты являются частью продукта, который будет устанавливаться в «дикой природе» и «звонить домой» для отправки и получения данных. Клиентское приложение написано для платформы .Net 2.0 и в настоящее время не может быть обновлено до 3.0 или 3.5. Я не могу добавлять учетные записи пользователей Windows на клиентские машины.

Каковы мои варианты защиты службы WCF и возможности аутентификации от моих клиентов .Net 2.0? Кроме того, данные необходимо передавать по https.

Я искал в Интернете и чувствую, что нахожусь в погоне за диким гусем.


person JasonS    schedule 24.10.2008    source источник


Ответы (5)


Вы можете настроить конечную точку WCF для использования двусторонней проверки подлинности SSL. Это означает, что вы можете потребовать от клиентов предоставить сертификат X.509, подтверждающий их личность, всякий раз, когда они делают запрос к службе.

На стороне сервера вы можете использовать один из встроенных в схемах проверки в WCF или предоставьте свою собственную логику проверки для проверки сертификата X.509.
Если бы вы размещали свою службу в IIS, было бы тривиально настроить SSL для запроса клиентских сертификатов в транспортном- уровень. Однако вы можете найти хорошее руководство по реализации этого поведения в автономной службе WCF здесь:

http://leastprivilege.com/2007/08/25/certificate-based-authentication-and-wcf-message-security/

Я сам этого не пробовал, но, поскольку это создает требование безопасности на уровне сообщения, я думаю, вам придется использовать wsHttpBinding, чтобы обеспечить его соблюдение в вашем контракте WSDL. , поскольку введение требований безопасности для доступа к веб-сервису является частью стандартов WS- *.

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

http://leastprivilege.com/2007/08/26/certificate-based-authentication-and-wcf-mode-independent/

Надеюсь это поможет

person Enrico Campidoglio    schedule 24.10.2008

Итак, с SSL у вас есть безопасность транспортного уровня; что нормально, это защищает сообщение от перехвата и изменения.

Итак, теперь у вас есть варианты; вам нужна проверка, чтобы молчать, или вы можете запросить у пользователя имя пользователя / пароль при запуске вашей программы? Если он должен быть тихим, вы можете использовать сертификат на стороне клиента, как упоминалось (хотя это болезненно, вам нужно будет самостоятельно сгенерировать сертификаты и проверить их, поэтому вам нужно посмотреть, как запустить свой собственный центр сертификации). Или вы можете встроить собственный заголовок в сообщение, которое содержит идентификатор клиента, и сделать это беспорядочно.

Однако, если вы можете запросить имя пользователя и пароль, вы аутентифицируетесь таким образом и довольно легко подключаете его к поиску в базе данных, используя настраиваемый аутентификатор или даже с помощью База данных членства ASP.NET.

person blowdart    schedule 24.10.2008
comment
+1 за указание на то, что также можно использовать модель поставщика членства ASP.NET в WCF для настраиваемой проверки подлинности. Для авторизации вы также можете использовать поставщик ролей ASP.NET. - person Enrico Campidoglio; 07.05.2009

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

  1. Обеспечил транспорт с помощью SSL
  2. Клиенты сначала входят в веб-службу, вызывая метод входа в веб-службу. В случае успешного входа в систему клиенту возвращается зашифрованный FormsAuthenticationTicket.
  3. Затем клиенты должны предоставлять билет проверки подлинности с помощью форм при каждом вызове веб-службы. Каждый метод проверяет, действителен ли билет, и если да, то выполняет свою работу. Если срок действия билета истек или он недействителен, клиенты должны пройти повторную аутентификацию.

Надеюсь, это кому-то поможет ...

person JasonS    schedule 01.06.2009

Ваша безопасность будет обеспечена ssl.

Для аутентификации у вас есть два варианта - базовый (имя пользователя и пароль) или сертификат.

Вот видео, демонстрирующее настройку аутентификации по сертификату.

В этом случае вы настраиваете элементы безопасности basicHttpBinding, показанные ниже:

‹BasicHttpBinding>
‹привязка name =" basicHttp ">
‹ security mode = "TransportWithMessageCredential">
‹сообщение clientCredentialType =" Certificate "/>
‹/security>
‹ / binding >
‹/basicHttpBinding>

На этой странице также есть хорошая здесь. Google на clientCredentialType, и вскоре вы окажетесь на правильном пути.

Для настройки клиентских сертификатов вам нужен файл политики wse *.

Вам нужно будет решить, как вы будете предоставлять клиентский сертификат различным сайтам - это зависит от проблем безопасности проекта. Существуют различные способы (ни один из которых я не могу вспомнить, извините, в последний раз я делал это для wse * to wse * около двух лет назад, поэтому детали забыты, но это, безусловно, возможно, потребовалось несколько дней твердых исследований, чтобы найти хороший метод ).

person David Hall    schedule 24.10.2008
comment
Вторая ссылка недействительна ... в ней есть ошибка сценария, и я не могу просмотреть всю статью. - person halfbit; 08.04.2011
comment
Хотя Chrome и IE не позволили мне ... Я вошел в систему через домашнюю страницу и обновился ... не повезло. Наконец, это сработало, когда я просто поискал вводное предложение, которое привело меня сюда: devx.com/ codemag / Article / 33342/1763 Спасибо, сейчас работаю. - person halfbit; 08.04.2011
comment
@makerofthings Как странно - на моей машине работают и Chrome, и IE. Ваш комментарий должен помочь другим, кто столкнулся с той же проблемой. - person David Hall; 08.04.2011

Использование SSL-сертификата - единственный вариант для клиента .NET 2.0, обращающегося к службе WCF, поскольку basicHttpBinding не обеспечивает безопасности. Используя SSL, вы защищаете весь транспортный канал.

Проверьте ссылку http://www.codeplex.com/WCFSecurityGuide/Release/ProjectReleases.aspx?ReleaseId=15892. Он охватывает безопасность WCF, охватывающую все сценарии.

Чтобы получить бесплатный сертификат SSL, посетите http://www.comodo.com/ или http://www.instantssl.com/ и попробуйте в своем приложении.

person user11039    schedule 24.10.2008
comment
Итак, SSL защитит транспорт, я понимаю. Но как насчет аутентификации? Я не могу позвонить в службу от тех, кто ее найдет. Я мог бы использовать подход «волшебной струны», но он далеко не идеален. - person JasonS; 24.10.2008