如何使用 wcf 的 .net Web 服务创建安全的 SOAP 主体?

Posted

技术标签:

【中文标题】如何使用 wcf 的 .net Web 服务创建安全的 SOAP 主体?【英文标题】:How to create secure SOAP body using .net webservices wse or wcf? 【发布时间】:2016-04-20 14:47:35 【问题描述】:

目前我正在使用.NET 的 Java Web 服务。在这里,我使用 WSE 3.0 来使用 Java 安全 Web 服务。但我得到了错误:

“抛出异常:无法检索引用的安全令牌”

在比较 java SOAP Request 和 .NET SOAP Request.here 之后,我发现我正在发送正确的 .net SOAP 标头,但我发送的正文是错误的。任何人都可以帮助我如何发送安全的正文请求表 .net 客户端

下面,我给出了 Java 和 .Net SOAP XML 数据:

.Net 请求 XML SOAP 正文(现在我正在发送)

<soap:Body wsu:Id="Id-165fc268-5917-43b9-aed2-091fb948c508">
          <xenc:EncryptedData Id="Enc-20dbd181-a655-4843-882a-b8b36b9d028d" Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
            <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
            <xenc:CipherData>
              <xenc:CipherValue>UO32nmFhQZ4JBNuWk6xTz20FpjfPWQqr1F5zqOf7uQ6hBJzfndGAJvb/l/MgT0x7P2ZTiEeNj51ZDYKDZrQ1Ax3SCJyzacX6suemUVWmMaVGtJ8DJPqka7T3xDkWpgVlDmc1am1B+E7SXdfd9RIINv+JpYhF5Fx4m3ZaeYvPQLVrvF3Rpvya2L1mC/LeHVYwM/ep6x5f9tQnz50UASBHIA==</xenc:CipherValue>
            </xenc:CipherData>
          </xenc:EncryptedData>
        </soap:Body>

JAVA 请求的 XML SOAP 正文(来自 java Web 服务器)

      <soap:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-2">
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="ED-5" Type="http://www.w3.org/2001/04/xmlenc#Content">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

<wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd" wsse11:TokenType="http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey">
<wsse:Reference URI="#EK-7FBF3DBE856BC8B2BC14527661038314"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>SQ0nnx45EPDL5uoFRzeTjJy6+FhaCZTK/3LRz5DrPM4qAQ2JzARNiLmuj61YSHd6nOMVy1QmPCqH5gG6PIIN8x47r10fzOkuisxpcOaUdnFL3bY55AvfyL6fUbSfcp+fl3qw6SAB3QF0AR1thqpfKBttBv8b7GxbpApCZg6TWaw8nD7G7dVmtdpDBJN7uQSQJu5ibdBGLzbVoF9YtliYH1mbdswL4KVJtZKUl2UAQqDtbxgXAkKtNwNyq4pt7N+HVhX00mZMxiTE0IyRyfgQhwp6afsTvsGVmdKxcpWtRoOFmmIHhrTeXJal/jJAI84mmg5EV44TJezFFbEyqsL+vhhR/N6oITaa
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</soap:Body>

知道如何将与 Java 相同的请求从 .Net Web 服务或 WCF 发送到服务器吗?

【问题讨论】:

您有 X.509 证书吗?通常它以 pfx 文件的形式出现? 是的,我在我的代码中使用 x.509 证书 我们希望看到您的客户端代码。看起来它找不到证书或您使用了错误的证书。 嗨,kosala w 感谢您的回复,我正在使用正确的证书,即 clientinvoke.pfx 我得到了正确的响应表单服务器但出现了一些错误“缺少参考令牌”..所以我只检查整个 sopa输入跟踪文件中服务器的响应我发现我在 中丢失了任何想法如何在侧体元素中传递这两个标签....? 正如我所说,我们需要查看您的客户端调用。您可能根本没有在 Web 服务调用中包含证书。 【参考方案1】:

您必须这样做才能将 X.509 集成到您的 Web 服务客户端。

       public void MyWebServiceClient()
       
            using (var client = new MyWebService())
            
                try
                
                    //calls the web service
                    client.Url = //Your server EndpointUri;

                    //assign cert
                    ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
                    string certificatePath = //certificate path
                    string certificatePassword = //certificate password
                    X509Certificate2 cert = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet);
                    client.ClientCertificates.Add(cert);

                    //var result = client.WebServiceCall(your input);
                
                catch (Exception ex)
                
                    throw new Exception("Error " + ex.Message);
                
            
        


    public bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
                
        // accept all certificates
        return true;
    

【讨论】:

嗨 kosala w 感谢您的建议,我在这里使用 Windows 窗体应用程序,我的代码如下所示

以上是关于如何使用 wcf 的 .net Web 服务创建安全的 SOAP 主体?的主要内容,如果未能解决你的问题,请参考以下文章

使用 WS 安全性在 WCF .NET 中向 Java Web 服务发送请求

如何在 .NET WCF 中保护 HTTP JSON Web 服务

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?

如何创建 PHP SOAP 客户端以在 SSL 下调用 WCF Web 服务?

选择啥? .net 3.5 中的 ASMX Web 服务或 WCF?

如何使用wcf服务整合paypal?