WCF客户端到WSE 3.0服务

问题描述:

我尝试创建WCF客户端到WSE 3.0服务。我已经在WSE3.0客户端上使用相同的服务。下面是它的配置:WCF客户端到WSE 3.0服务

<microsoft.web.services3> 
    <security> 
    <timeToleranceInSeconds value="10000"/> 
    <x509 allowTestRoot="true" verifyTrust="true" storeLocation="CurrentUser"/> 
    <binarySecurityTokenManager> 
    <add valueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"> 
    <keyAlgorithm name="RSA15"/> 
    </add> 
    </binarySecurityTokenManager> 
    </security> 
</microsoft.web.services3> 

而对于以这样的方式创建服务客户端的策略:

MutualCertificate10Assertion assertion = new MutualCertificate10Assertion() 
    { 
    EstablishSecurityContext = false, 
    RenewExpiredSecurityContext = true, 
    RequireSignatureConfirmation = false, 
    MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt, 
    RequireDerivedKeys = false, 
    TtlInSeconds = 300 
    }; 

    assertion.ClientX509TokenProvider = new X509TokenProvider(StoreLocation.LocalMachine, StoreName.My, "ClientCerfiticateName", X509FindType.FindBySubjectName); 
    assertion.ServiceX509TokenProvider = new X509TokenProvider(StoreLocation.LocalMachine, StoreName.My, "ServiceCerfiticateName", X509FindType.FindBySubjectName); 

    //protection 
    assertion.Protection.Request.SignatureOptions = SignatureOptions.IncludeAddressing | SignatureOptions.IncludeTimestamp | SignatureOptions.IncludeSoapBody; 
    assertion.Protection.Request.EncryptBody = true; 

    assertion.Protection.Response.SignatureOptions = SignatureOptions.IncludeAddressing | SignatureOptions.IncludeTimestamp | SignatureOptions.IncludeSoapBody; 
    assertion.Protection.Response.EncryptBody = true; 

    assertion.Protection.Fault.SignatureOptions = SignatureOptions.IncludeAddressing | SignatureOptions.IncludeTimestamp | SignatureOptions.IncludeSoapBody; 
    assertion.Protection.Fault.EncryptBody = false; 

    this.Policy = new Policy(new TraceAssertion(serviceUri), assertion, new RequireActionHeaderAssertion()); 

现在我尝试使用它来创建WCF客户端。我使用了这些建议(http://msdn.microsoft.com/en-us/library/ms730299.aspx)。我生成的类型形成的服务和客户端的合同之间的结合,衍生然后创建WseHttpBinding类,在那之后我试图创建自定义的绑定和初始化客户端和服务证书:

string clientCertificateName = "ClientCertificateName"; 
string serviceCertificateName = "ServiceCertificateName"; 

Uri uri = new Uri("http://WantedService.asmx")); 

    EndpointAddress address = new EndpointAddress(uri, 
         EndpointIdentity.CreateDnsIdentity(serviceCertificateName)); 

    WseHttpBinding binding = new WseHttpBinding() 
    { 
    SecurityAssertion = WseSecurityAssertion.MutualCertificate10, 
    EstablishSecurityContext = false, 
    RequireSignatureConfirmation = false, 
    MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt, 
    RequireDerivedKeys = false 
    }; 

    WantedServiceClient client = new CreativeGroupCurrencyServiceClient(binding, address); 

// Set up certificates  
client.ClientCredentials.ServiceCertificate.SetScopedCertificate(
          StoreLocation.LocalMachine, 
          StoreName.My, 
          X509FindType.FindBySubjectName, 
          serviceCertificateName , 
          uri); 

    client.ClientCredentials.ClientCertificate.SetCertificate(
          StoreLocation.LocalMachine, 
          StoreName.My, 
          X509FindType.FindBySubjectName, 
          clientCertificateName); 

    WantedMethodResponse response = client.WantedMethod(new GetCurrenciesRequest()); 

但在发生异常:

System.Xml.XmlException:无法读取 从 的 'http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd' 命名空间中的 'SignatureConfirmation' 元素的令牌 BinarySecretSecurityToken,与一个'' ValueType。如果预计该元素 有效,请确保安全性为 ,该安全性配置为消耗具有 名称,名称空间和值类型 的令牌。

它为什么不起作用?为什么这个计划是1.1?我应该在MessageSecurityVersion中使用WS Secure 1.1来获取安全绑定元素吗?哪一个?我尝试这样做:

WseHttpBinding binding = new WseHttpBinding() 
    { 
    SecurityAssertion = WseSecurityAssertion.MutualCertificate11, 
    ... 
    }; 

哪一个使用WS安全1.1 - MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11(配置在WseHttpBinding一段时间),但它也失败:

System.ServiceModel.Security.MessageSecurityException: 预计不会签字确认安全头中的 。

我不知道我现在甚至可以做什么!看来我尝试了一切!

根据this文章,msdn article在wcf wse兼容性上有错误。特别是关于消息版本。这可能是什么导致你的问题。