>我正在使用第三方 J2EE Web 服务,该服务需要使用证书对请求进行签名,但 Web 服务正在响应未签名的响应。
这是我执行请求的方式:
public static WcfServiceNamespace.ResponseType GetResponse(X509Certificate2 certificate)
{
var request = GetExampleRequest();
var endPoint = new EndpointAddress($"https://endPoint.url/contoso");
var binding = GetCustomBinding();
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new WcfServiceNamespace.ServicePortTypeClient(binding, endPoint))
{
client.Endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign;
client.ClientCredentials.ClientCertificate.Certificate = certificate;
return client.ProcessRequest(request);
}
}
private static Binding GetCustomBinding()
{
var c = new CustomBinding();
var version = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
var sec = SecurityBindingElement.CreateCertificateOverTransportBindingElement(version);
sec.EnableUnsecuredResponse = true;
sec.AllowInsecureTransport = true;
sec.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
c.Elements.Add(sec);
c.Elements.Add(new TextMessageEncodingBindingElement() {MessageVersion = MessageVersion.Soap11});
c.Elements.Add(new HttpsTransportBindingElement() { RequireClientCertificate = true });
return c;
}
Java Web 服务正在正确响应没有任何标头的请求:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<!-- correct response -->
</soapenv:Body>
</soapenv:Envelope>
但是 WCF 客户端在尝试处理响应时引发异常:
System.ServiceModel.Security.MessageSecurityException: 'Cannot find a token authenticator for the 'System.IdentityModel.Tokens.X509SecurityToken' token type. Tokens of that type cannot be accepted according to current security settings.'
我已经尝试过此配置: WCF - 找不到 X509SecurityToken 的令牌身份验证器 但它不能解决我的问题,因为正如我之前解释的那样,响应的标头完全为空,并且端点正在使用 https 但没有可信任的证书。
我的问题是: 有没有办法将 WCF 配置为正确签署请求但忽略响应安全性?
编辑:我已经尝试过这个问题:
- IBM DataPower 3.7.1.x WCF 客户端出现问题
- 调用 WS 安全 Web 服务的 WCF 错误:找不到 X509安全令牌的令牌身份验证器
但答案无济于事
编辑:我让它与WSE3一起工作,但我想使用更新的技术。如果它在WSE3中有效,为什么不适用于WCF?
我们是否可以使用以下工具来生成 SOAP 客户端,通过它我们可以像下面的方法一样调用服务?
https://learn.microsoft.com/en-us/dotnet/framework/wcf/servicemodel-metadata-utility-tool-svcutil-exe
它是Visual Studio中的内置工具,我们可以通过使用SVCUtil
命令生成客户端代理类以及兼容的自定义绑定和安全模式配置。 客户端代理将在实例化时自动使用与服务器兼容的配置来创建请求。
或者,我们可以通过添加服务引用菜单生成客户端代理。
https://learn.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client 我从未调用过 J2EE Web 服务,请告诉我它是否有帮助。