C#在Windows Phone 8.1中签署Soap Header

时间:2017-05-19 22:00:47

标签: c# soap windows-phone

我们需要在Windows 8.1手机上调用带有签名时间戳标头的Soap服务器。我们使用VS Community 2015作为我们的开发环境。 Web服务站点为我们提供了签名证书。不使用用户名/密码。

我们已尝试使用从wsdl文件添加服务引用生成的代码,但尚未找到如何对标头进行签名。当我们尝试运行调用时,我们得到一个“InvalidOperationException”,文本说我们需要提供用户名。如果我们随后在ClientCredentials中提供随机用户名/密码,我们会收到MessageSecurityException,其中包含“从另一方收到不安全或不正确安全的故障。请参阅内部FaultException以获取故障代码和详细信息。”

有没有人设法使用证书在Windows 8.1手机上签署带时间戳的肥皂标题?注意到MSDN上肥皂客户端的大多数页面都找不到页面。

在此之后,我们查看了在c#中签署soap请求标头的示例。在下面的代码示例中,我们没有发现System.Security.Cryptography.XML包不可用。有没有人知道XmlDsigC14NTransform的移动位置或者什么是替换为soap头中的时间戳获取DigestValue的替换?

关于这个问题的底线问题是否有人会举例说明如何使用带有时间戳的soap标头执行soap请求,该标头适用于Windows 8.1手机?

以下是我们尝试过的。名称和地址等已更改

        SoapWS.myRequest req = new SoapWS.myRequest();
        // setup the request fields


        CustomBinding binding = new CustomBinding();
        binding.Namespace = "urn:<the name space>";
        binding.Name = "<name of binding>";
        TransportSecurityBindingElement securityElement = new TransportSecurityBindingElement();
        securityElement.IncludeTimestamp = true;


        X509Certificate cert = new X509Certificate(<from loaded bytes>);

        binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8));
        binding.Elements.Add(securityElement);
        binding.Elements.Add(new HttpsTransportBindingElement());

        SoapWS.myRequestClient client = new SoapWS.myRequestClient(
            binding,
            addr);

        //client.ClientCredentials.UserName.UserName = "admin";
        //client.ClientCredentials.UserName.Password = "admin";

        using (new OperationContextScope(client.InnerChannel))
        {
            // Add a SOAP Header to an outgoing request
            MessageHeader aMessageHeader = MessageHeader.CreateHeader("Security", binding.Namespace, cert);
            OperationContext.Current.OutgoingMessageHeaders.Add(aMessageHeader);
        }

        client.myRequestCompleted += Client_completed;
        client.myRequestSessionAsync(req);

0 个答案:

没有答案