使用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. 修改配置文件进行跟踪。需要添加diagnostics和system。诊断信息。
<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 } } }
- 如果您需要消息中的PII信息,您必须编辑de machine。 Microsoft.NET
您可以获得签名的SOAP消息,但是BinarySecurityToken被删除。
...<o:BinarySecurityToken><!--Removed--></o:BinarySecurityToken>...
C: ' Windows ' ' {version} ' Config ' machine.config框架C:'Windows' Microsoft.NET ' Framework64 {version} ' Config ' machine.config
添加 enablelogingknownpii 参数
<system.serviceModel>
<machineSettings enableLoggingKnownPii="true"/>
...
</system.serviceModel>
现在,您可以在调用服务时获得完整的签名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/.