我正在使用我自己的网络服务 (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>
创建继承自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>...
- 如果您需要消息中的 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 :
- 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 (有关解释,请直接转到实现解决方案段落)
然后自定义 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/