Я пытаюсь создать клиент 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: в заголовке безопасности не ожидается подтверждение подписи.
Я не знаю, что я могу сделать даже сейчас!Кажется, я все перепробовал!