使用WCF在客户端获取签名SOAP消息

本文关键字:SOAP 消息 获取 WCF 客户端 使用 | 更新日期: 2023-09-27 18:18:37

我正在使用来自我自己的web服务(WCF)的web服务(Java)。我需要得到签名的SOAP消息请求(安全头签名),我发送到Java web服务并保存它(文件,数据库,…)。

我已经尝试使用beforeendrequest方法使用IClientMessageInspector,但请求尚未签署。有没有办法在发送请求之前得到签名?

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
       var content = request.ToString();
       // request is not signed yet
       return null;
    }

另一个选项可以是"手动"签名请求…在过去,我使用SoapEnvelope类(Microsoft.Web.Services3)和.asmx web服务来实现它。我试过使用CustomMessageHeader,但这是不可能的(对我来说)。

有人有什么想法吗?

Thanks in advance

编辑:我终于找到了一个解决方案适合我。我使用WCF跟踪。在其中一个步骤中,您必须编辑机器。客户端配置文件。它可能并不适用于每个人

如何:1. 修改配置文件进行跟踪。需要添加diagnosticssystem。诊断信息。

    <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> 
  • 创建从TraceListener继承的类mytreelistener

    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>...
    
  • 如果您需要消息中的PII信息,您必须编辑de machine。
  • Microsoft.NET

    C: ' Windows ' ' {version} ' Config ' machine.config框架C:'Windows' Microsoft.NET ' Framework64 {version} ' Config ' machine.config

    添加 enablelogingknownpii 参数

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

    现在,您可以在调用服务时获得完整的签名SOAP消息。

    我希望它能帮助到别人。:)

    使用WCF在客户端获取签名SOAP消息

    要获得带有元素签名的消息,您必须创建一个自定义

    通道,您可以在其中对消息进行操作。

    您可以按照以下两个链接创建通道:

    • http://code.msdn.microsoft.com/BizTalk-Server-REST-Error-52fa4ff0
    • http://social.technet.microsoft.com/wiki/contents/articles/16625.biztalk-server-rest-services-error-handling.aspx(说明请直接进入实施解决方案段落)

    自定义通道应该包含在customBinding中。必须是最后一个元素:

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

    新通道必须是最后一个,以便拥有处理最多的消息。

    如果你需要转换你的绑定,看看你可以使用这个工具:http://webservices20.cloudapp.net/.