【问题标题】:Get signed SOAP Message in client using WCF使用 WCF 在客户端获取签名的 SOAP 消息
【发布时间】:2015-10-21 13:05:27
【问题描述】:

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

我尝试使用 IClientMessageInspector 使用 BeforeSendRequest 方法,但请求尚未签名。有什么方法可以在发送之前获取签名请求?

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

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

       return null;
    }

另一种选择可能是“手动”签署请求...我过去是使用带有 .asmx Web 服务的 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  
            }       
         }
    }
    

您可以获得签名的 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 消息。

我希望它可以帮助某人。 :)

【问题讨论】:

  • 您要使用哪种签名方式?如果签名是 WS-*,WCF 可能有一个绑定来自动执行此操作。

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


【解决方案1】:

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

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

您可以通过以下两个链接创建频道:

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

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

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

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

【讨论】:

猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2010-12-16
  • 2011-10-24
  • 2011-11-15
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多