Пример взаимодействия с сервисом СМЭВ с использованием 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 Code
SMEVMessageEncodingBindingElement 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; |