c# - 使用 WCF 在客户端中获取签名的 SOAP 消息

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

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

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

    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. 修改跟踪配置文件。您需要添加诊断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 消息。

希望对大家有所帮助。 :)

最佳答案

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

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

您可以点击以下两个链接创建 channel :

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

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

新 channel 必须是最后一个才能处理最多的消息。

如果您需要转换绑定(bind),请查看您可以使用此工具进行转换:http://webservices20.cloudapp.net/ .

关于c# - 使用 WCF 在客户端中获取签名的 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33260152/

相关文章:

web-services - 向 Web 服务响应添加可空字段是否会破坏向后兼容性?

c# - wcf方法参数中的反序列化json为空

c# - 对 EntityFramework 和 "normal"SQL 调用使用相同的 SqlConnection

c# - 如何使用具有两个不同参数值的 HttpGet 方法

c# - IComparable<T>.CompareTo() 返回值?

java.lang.IllegalArgumentException,但参数似乎是有效类型

ios - 尝试调用 Web 服务方法时从 NSURLResponse 返回的错误数据

wcf - 更新服务引用不起作用

wcf - InnerException 消息是“在传递给 W 服务时使用数据协定名称键入

c# - 从 Outlook 的邮件编辑器中获取 HTML - ControlType.Document