如何使用 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输入跟踪文件中服务器的响应我发现我在您必须这样做才能将 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 服务?