Клиент WCF для сервиса WSE 3.0 - PullRequest
       15

Клиент WCF для сервиса WSE 3.0

3 голосов
/ 30 августа 2010

Я пытаюсь создать клиент WCF для сервиса WSE 3.0.У меня уже работает клиент WSE3.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, полученный из Binding, после чего я попытался создать эту пользовательскую привязку и инициализировать сертификаты клиента и службы:

 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: Невозможно прочитать токен из элемента 'SignatureConfirmation' с помощью 'http://docs.oasis -open.org / wss/oasis-wss-wssecurity-secext-1.1.xsd 'пространство имен для BinarySecretSecurityToken с' 'ValueType. Если предполагается, что этот элемент допустим, убедитесь, что безопасность настроена на использование маркеров с именем, пространством имен и значениемуказан тип.

Почему это не работает? И почему схема 1.1? Должен ли я использовать WS Secure 1.1 в в MessageSecurityVersion для безопасного элемента привязки? И какой? Я пробовал это:

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

Какой из них использует WS Security 1.1 - MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11 (при настройке в WseHttpBinding), но также произошел сбой:

System.ServiceModel.Security.MessageSecurityException: в заголовке безопасности не ожидается подтверждение подписи.

Я не знаю, что я могу сделать даже сейчас!Кажется, я все перепробовал!

1 Ответ

0 голосов
/ 30 августа 2010

Согласно этой статье в msdn статье есть ошибка по совместимости с wcf.В частности, в отношении версий сообщений.Это может быть причиной проблем.

...