Пример взаимодействия с сервисом СМЭВ с использованием Windows Communication Foundation.
Демонстрирует
Данный пример демонстрирует взаимодействие с сервиcом СМЭВ в режиме безопасности сообщений с использованием алгоритмов ГОСТ.
Исходные тексты
Исходные тексты примера находятся в файле WCF.zip в подкаталоге SMEV, Подробнее см. Сборка, запуск и местоположение примеров WCF.
Как собрать пример
Сборка примера не требует дополнительных действий, по сравнению с инструкциями по сборке к данной группе примеров, указанных в Сборка, запуск и местоположение примеров WCF.
Как запустить пример
Перед запуском примера необходимо получить сертификат подписи запроса, выпущенный Удостоверяющим центом, входящим в ЕПД.
Особенности взаимодействия с сервисом СМЭВ
Для взаимодействия с сервисом СМЭВ требуется модифицировать привязку сгенерированную по WSDL сервиса. По умолчанию, режим безопасности сообщений на задан. Требуется внести следующие изменения:
Задать режим защиты WCF на уровне сообщений.
Задать алгоритм аутентификации ГОСТ (BasicGostObsolete).
Задать аутентификацию клиента по сертификату.
<binding name="binding_name" messageEncoding="Text" textEncoding="utf-8">
    <security mode="Message">
        <transport clientCredentialType="None" proxyCredentialType="None" />
        <message clientCredentialType="Certificate" algorithmSuite="BasicGostObsolete" />
    </security>
</binding>
                 | |
Для режима защиты Message по умолчанию задано требование подписи и шифрования сообщений. Для взаимодействия с сервисом СМЭВ требуется только подпись сообщения.
| C# | |
|---|---|
smevClient.ChannelFactory.Endpoint.Contract.ProtectionLevel = System.Net.Security.ProtectionLevel.Sign;
                 | |
Для того чтобы сервис СМЭВ понимал заголовок безопасности SOAP запроса нужно задать собственный кодировщик сообщений CryptoPro.Sharpei.ServiceModel.SMEVTextMessageEncoder, определённый в сборке CryptoPro.Sharpei.ServiceModel.dll. Задать кодировщик сообщений можно как программно, так и через файл конфигурации.
Пример программного задания кодировщика сообщений.
C# 
Copy CodeSMEVMessageEncodingBindingElement textBindingElement = new SMEVMessageEncodingBindingElement(); CustomBinding binding = new CustomBinding(smevClient.Endpoint.Binding); binding.Elements.Remove<TextMessageEncodingBindingElement>(); binding.Elements.Insert(0, textBindingElement);Пример задания кодировщика сообщений через файл конфигурации.
Copy Code<extensions> <bindingElementExtensions> <add name="SMEVTextMessageEncoder" type="CryptoPro.Sharpei.ServiceModel.SMEVMessageEncodingElement, CryptoPro.Sharpei.ServiceModel, Version=*.*.*.*, Culture=neutral, PublicKeyToken=473b8c5086e795f5" /> </bindingElementExtensions> </extensions> <customBinding> <binding name="binding_name"> <security defaultAlgorithmSuite="BasicGostObsolete" includeTimestamp="false"> <localClientSettings detectReplays="false"/> <localServiceSettings detectReplays="false"/> </security> <SMEVTextMessageEncoder/> </binding> </customBinding>При регистрации кодировщика (секция <bindingElementExtensions/>) требуется указать полное имя сборки, в коротой реализован соответвующий класс. В атрибуте Version задается версия сборки: 1.0.0.1 для NET3.5, 1.4.0.1 для NET4. Для элемента конфигурации <SMEVTextMessageEncoder/> определены следующие атрибуты:
recepient - значение атрибута actor для отправляемого сообщения. Значение по умолчанию: http://smev.gosuslugi.ru/actors/smev
sender - значение атрибута actor для входящего сообщения. Значение по умолчанию: http://smev.gosuslugi.ru/actors/recipient
messageVersion - версия SOAP-сообщения. Значение по умолчанию: Soap11WSAddressingNone
Для того чтобы клиент смог проверить подпись под ответом сервиса, требуется изменить поведение WCF по умолчанию:
| C# | |
|---|---|
binding.Elements.Find<AsymmetricSecurityBindingElement>().LocalClientSettings.DetectReplays = false;
                 | |