WCF绑定传输和消息安全性

时间:2013-09-20 15:07:52

标签: wcf soap wcf-security basic-authentication ws-security

我正在开展一个大型项目,该项目广泛使用 WCF 进行不同类型的通信。作为新要求的一部分,我们需要与第三方开发的 SOAP Web服务进行通信。他们的服务是用Java开发的,有两个安全要求:

  1. 它需要 BASIC身份验证而不是

  2. 邮件必须使用 WS-Security(OASIS)标准进行签名(未加密)并使用X509证书进行不可否认。

  3. 我遇到的问题是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:请注意,我无法控制我正在尝试与之通信的网络服务。

1 个答案:

答案 0 :(得分:2)

配置https传输通道:

HttpsTransportBindingElement h = new HttpTransportBindingElement();
h.AuthenticationScheme = AuthenticationSchemes.Digest;
h.realm = ...

如果你遇到麻烦我建议首先设置一个workign transport基本的http绑定,这样你就会看到你通过throguh服务器https传输(你应该期望得到一个肥皂错误b / c缺乏签名)。< / p>