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

时间:2015-10-21 13:05:27

标签: c# web-services wcf soap ws-security

我从自己的Web服务(WCF)中使用Web服务(Java)。我需要获取已签名的SOAP消息请求(带有安全标头签名),我将其发送到Java Web服务并保存(文件,数据库......)。

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

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

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

       return null;
    }

另一种选择可能是手动签署请求' ...我过去使用带有.asmx网络服务的SoapEnvelope类(Microsoft.Web.Services3)来做。 我尝试过使用CustomMessageHeader,但这对我来说是不可能的。

有没有人有想法?

提前致谢

编辑:我终于找到了适用于我的解决方案。我使用了WCF跟踪。 在其中一个步骤中,您必须编辑客户端上的machine.config文件。它可能对每个人都不起作用

如何: 1.修改配置文件以进行跟踪。您需要添加 diagnostics 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. 创建继承自TraceListener

    的类MyTreceListener
    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  
            }       
         }
    }
    
  2. 您可以获取已签名的SOAP消息,但 BinarySecurityToken 已被删除。

       ...<o:BinarySecurityToken><!--Removed--></o:BinarySecurityToken>...
    
    1. 如果您需要消息中的PII信息,则必须在客户端中编辑de machine.config。
    2. C:\的Windows \ Microsoft.NET \框架{版本} \配置\ machine.config中 C:\的Windows \ Microsoft.NET \ Framework64 {版本} \配置\ machine.config中

      添加 enableLoggingKnownPii 参数

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

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

      我希望它有助于某人。 :)

1 个答案:

答案 0 :(得分:0)

要获取包含已签名元素的消息,您必须创建自定义

频道,您可以在其中对该讯息采取行动。

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

然后,自定义渠道应包含在customBinding中。它必须是最后一个元素:

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

新频道必须是最后一个才能获得处理最多的消息。

如果您需要转换绑定,请查看您可以使用此工具制作它:http://webservices20.cloudapp.net/