我正在从事一个大项目,该项目广泛使用WCF用于不同类型的通信。作为新要求的一部分,我们需要与SOAP由第三方开发的 Web 服务。他们的服务是用Java开发的,有两个安全要求:
它需要基本身份验证超过运输和
该消息必须是使用 X509 证书签名(未加密)使用WS-安全(OASIS)不可否认性标准。
我遇到的问题是 WCF 提供的绑定允许使用传输或消息安全性,但是不同时两者。因此,我可以签署 SOAP 消息或发送 BASIC 身份验证凭据,但到目前为止我还无法按照我的要求同时完成这两项操作。
几天来我一直在努力寻找解决方案,到目前为止,我得出的结论是,我最好的选择可能是以编程方式进行自定义绑定。使用多个来源,这就是我现在所拥有的:
var b = new CustomBinding();
var sec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10);
UserNameSecurityTokenParameters tokenParamenters = new UserNameSecurityTokenParameters();
tokenParamenters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
tokenParamenters.RequireDerivedKeys = false;
b.Elements.Add(sec);
b.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
b.Elements.Add(new HttpsTransportBindingElement());
WSClient svc = new WSClient(b, new EndpointAddress(new Uri("https://serviceurl.com/SoapWS"), new DnsEndpointIdentity("CertificateIdentity"), new AddressHeaderCollection()));
svc.ClientCredentials.UserName.UserName = "username";
svc.ClientCredentials.UserName.Password = "password";
svc.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2("Certificate.p12", "password");
svc.ClientCredentials.ServiceCertificate.DefaultCertificate = new X509Certificate2("Certificate.p12", "password");
svc.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
string resp = svc.DoSomething();
虽然这似乎是使用证书对消息进行签名(无法完全检查),但基本身份验证部分并未发生。来自服务器的响应是:
HTTP 请求未经客户端身份验证方案“匿名”的授权。从服务器收到的身份验证标头是“Basic Realm=”realm””。
任何关于如何让此绑定通过 BASIC 身份验证进行传输身份验证的见解都会非常有帮助。提前致谢。
PS:请注意,我无法控制我尝试与之通信的网络服务。