- •Технология wcf Оглавление
- •Введение
- •Создание wcf-сервиса
- •Создание интерфейса сервиса
- •Концепция “abc”
- •Хосты сервисов wcf
- •Развертывание wcf-сервиса в консольном приложении
- •Настройка конфигурационного файла
- •Публикация метаданных сервиса
- •Развертывание wcf-сервиса в iis
- •Создание клиента
- •Контракты данных
- •Контракты ошибок
- •Отладка системы wcf
- •Безопасность wcf
- •Заключение
Безопасность wcf
В любых более-менее крупных приложениях всегда существует аспект безопасности. Клиент может общаться с сервисом через открытые сети, сообщения проходят на своем пути массу компьютеров, на каждом из которых они могут быть перехвачены, проанализированы и изменены. Кроме того, создание сервиса, к которому может подключиться кто угодно, может привести к возможности атак типа «отказ в обслуживании», когда к вашему сервису подключиться множество клиентов и начнут выполнять его методы. Все эти проблемы нужно решать. Каким пользователям можно подключаться к сервису, а каким нельзя? Какие операции сервиса может вызывать подключившийся пользователь, а какие нет? К счастью WCF имеет встроенные механизмы аутентификации и авторизации пользователей.
Фактически WCF имеет 2 механизма обеспечения безопасности: на уровне транспорта и на уровне сообщений. В первом случае WCF полагается на механизмы обеспечения безопасности, существующие в тех протоколах обмена информацией, которые используют сервис и клиент. Достоинством этого подхода является низкая нагрузка на вашу систему, поскольку все мероприятия по обеспечению безопасности проводятся на аппратном уровне. Однако не все привязки поддерживают этот тип безопасности. Безопасность сообщений, напротив, доступна в любом случае. Но при ее использовании на WCF ложится ответственность за шифрование и расшифровку сообщений, за безопасный обмен ключами и т.д.
В большинстве случаев механизмы обеспечения безопасности предполагают использование сертификатов для удостоверения личности сервиса (всегда) и личности клиента (иногда). Но создание и установка сертификатов является долгим процессом. Поэтому мы рассморим простейший пример обеспечения транспортной безопасности сервиса. Предполагается, что и сервис и его клиенты расположены в одном домене. Поэтому они могут идентифицировать друг друга, используя один и тот же контроллер домена, проверяющий их учетные записи. Для использования транспортной безопасности на основе учетных записей Windows для обмена сообщениями, должен использоваться протокол TCP. Сервис, размещенный на IIS, всегда использует HTTP, поэтому мы будем применять хост в виде консольного приложения. Вот его конфигурационный файл:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTCPBinding_IFirstService">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="ServiceLibrary.FirstService">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:12324/SimpleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="netTcpBinding" bindingConfiguration="NetTCPBinding_IFirstService"
contract="ServiceLibrary.IFirstService"/>
</service>
</services>
</system.serviceModel>
</configuration>
Как видите, изменения не велики. Привязка изменилась с wsHttpBinding на netTcpBinding, соответствующим образом поменялся и адрес. Основные изменения коснулись настройки привязки. Теперь мы не можем использовать параметры привязки netTcpBinding по умолчанию, поскольку по умолчанию всякая безопасность выключена. Параметры всех привязок описываются внутри элемента bindings. В нашем случае мы включаем транспортную безопасность и говорим, что для аутентификации пользователя будут использоваться учетные записи Windows. С помощью аттрибута bindingConfiguration элемента endpoint мы говорим, какие именно параметры привязки мы будем использовать. Значение этого аттрибута совпадает со значением аттрибута name привязки binding.
На стороне клиента конфигурационный файл выглядит практически так же:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTCPBinding_IFirstService">
<security mode="Transport">
<transport clientCredentialType="Windows"/>
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:12324/SimpleService" binding="netTcpBinding" bindingConfiguration="NetTCPBinding_IFirstService"
contract="ServiceReference.IFirstService" />
</client>
</system.serviceModel>
</configuration>
Вот и все. Теперь все общение клиента с сервисом защищено от чужих глаз.
