Получить подписанное сообщение SOAP в клиенте с помощью WCF

Я использую веб-службу (Java) из своей собственной веб-службы (WCF). Мне нужно получить подписанный запрос сообщения SOAP (с подписанным заголовком безопасности), который я отправляю в веб-службу Java, и сохранить его (файл, базу данных, ...).

Я пробовал использовать IClientMessageInspector с помощью метода BeforeSendRequest, но запрос еще не подписан. Есть ли способ получить подписанный запрос перед его отправкой?

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {

       var content = request.ToString();
       // request is not signed yet

       return null;
    }

Другой вариант - подписать запрос «вручную» ... Раньше я делал это с помощью класса SoapEnvelope (Microsoft.Web.Services3) с веб-службами .asmx. Я пробовал использовать CustomMessageHeader, но это было невозможно (для меня).

Есть у кого-нибудь идеи?

заранее спасибо

ИЗМЕНИТЬ. Наконец-то я нашел решение, которое мне подходит. Я использовал трассировку WCF. На одном из шагов вы должны отредактировать файл machine.config на клиенте. Это может не сработать для всех

Как: 1. Изменить файл конфигурации для трассировки. Вам необходимо добавить информацию о диагностике и system.diagnostics.

    <configuration>  
     <system.serviceModel>      
      <diagnostics>
       <!-- I need logMessagesAtTransportLevel only -->
       <messageLogging
          logEntireMessage="false"
          logMalformedMessages="false"
          logMessagesAtServiceLevel="false"
          logMessagesAtTransportLevel="true" 
          logKnownPii="true"
          maxMessagesToLog="1000"
          maxSizeOfMessageToLog="200000"/>
       </diagnostics>   
      <binding>...</binding>
      <client>...</client>
    </system.serviceModel>
    <system.diagnostics>
     <sources>     
      <source name="System.ServiceModel.MessageLogging"
              logKnownPii="true"
              switchValue="Verbose, ActivityTracing">
      <listeners>         
        <add name="xmlTracer" />
      </listeners>
     </source>
    </sources>
    <sharedListeners>     
     <add name="xmlTracer" type="MyNamespace.MyTraceListender, MyNamespace" />
    </sharedListeners>
    <trace autoflush="true" />
   </system.diagnostics>
 </configuration> 
  1. Создайте класс MyTreceListener, унаследованный от TraceListener

    namespace MyNamespace
    {
        public class MyTraceListender : System.Diagnostics.TraceListener
        {
            public override void Write(string message)
            {             
                Debug.WriteLine(message);
            }
    
            public override void WriteLine(string message)
            {
                Debug.WriteLine(message); 
                // Here we have the signed SOAP !!
                // Make sure it's the request, this method is invoked many      times  
            }       
         }
    }
    

Вы можете получить подписанное сообщение SOAP, но BinarySecurityToken удален.

   ...<o:BinarySecurityToken><!--Removed--></o:BinarySecurityToken>...
  1. Если вам нужна информация PII в сообщении, вы должны отредактировать файл de machine.config в клиенте.

C: \ Windows \ Microsoft.NET \ Framework {версия} \ Config \ machine.config C: \ Windows \ Microsoft.NET \ Framework64 {версия} \ Config \ machine.config

Добавить параметр enableLoggingKnownPii

    <system.serviceModel>
      <machineSettings enableLoggingKnownPii="true"/>
      ...
    </system.serviceModel>

Теперь вы можете получить полное подписанное сообщение SOAP при вызове службы.

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


person Carlos Pérez    schedule 21.10.2015    source источник
comment
Какой вид подписи вы хотите использовать? Если подпись WS- *, вероятно, у WCF есть привязка, чтобы сделать это автоматически.   -  person Rom Eh    schedule 21.10.2015


Ответы (1)


Чтобы получить сообщение с подписанными элементами, вам необходимо создать собственный

канал, в котором вы сможете действовать в соответствии с сообщением.

Вы можете перейти по двум следующим ссылкам для создания канала:

Затем клиентский канал следует включить в customBinding. Это должен быть последний элемент:

<bindings>
    <customBinding>
        <binding name="myBinding">
            <textMessageEncoding messageVersion="Soap12WSAddressing10" />
            <security messageProtectionOrder="SignBeforeEncryptAndEncryptSignature" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11" />
            <httpsTransport />
            <myBindingChannel />
        </binding>
    </customBinding>
</bindings>

Новый канал должен быть последним, чтобы сообщение было наиболее обработанным.

Если вам нужно преобразовать привязку, взгляните на этот инструмент, чтобы сделать это: http://webservices20.cloudapp.net/.

person Rom Eh    schedule 21.10.2015
comment
Проблема не в том, как правильно подписать запрос, проблема в том, как подписать запрос (как вы можете видеть, например, в скрипте) и сохранить его. Я могу использовать привязку для создания правильного запроса, но не могу получить доступ к подписанному запросу. - person Carlos Pérez; 21.10.2015
comment
Хорошо я понял. Я думаю, вам нужно создать клиентский канал. У вас есть образец здесь: code.msdn.microsoft.com/BizTalk- Server-REST-Error-52fa4ff0 (и объяснения social.technet.microsoft.com/wiki/contents/articles/, начните с Реализации решения) - person Rom Eh; 21.10.2015
comment
Затем клиентский канал следует включить в customBinding. - person Rom Eh; 21.10.2015
comment
Спасибо, посмотрю !! - person Carlos Pérez; 21.10.2015
comment
Привет, Ром Эх. Наконец, я попытался использовать этот пример (msdn.microsoft .com / en-us / library / ms751495 (v = vs.100) .aspx), но результат тот же: сообщение еще не подписано. - person Carlos Pérez; 26.10.2015
comment
Привет. Вы создали настраиваемую привязку и наконец-то разместили свой компонент? - person Rom Eh; 27.10.2015