Требуемая часть сообщения "Действие", "http://www.w3.org/2005/08/addressing" не была подписана

У меня есть доступ к внешнему веб-сервису на основе Java, который я не могу контролировать из клиента WCF, использую двойные сертификаты для шифрования и подписи, а также пользовательское связывание. Я получаю успешный ответ от сервера, но WCF выдает исключение MessageSecurityException: требуемая часть сообщения "Действие", http://www.w3.org/2005/08/addressing не подписана.

Моя пользовательская привязка:

private CustomBinding GetCustomBinding()
{
    CustomBinding binding = new CustomBinding();
    binding.OpenTimeout = new TimeSpan(0, 0, 20);
    binding.CloseTimeout = new TimeSpan(0, 0, 20);
    binding.SendTimeout = new TimeSpan(0, 5, 0);
    binding.ReceiveTimeout = new TimeSpan(0, 5, 0);

    var userNameToken = new UserNameSecurityTokenParameters();
    userNameToken.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;

    var securityElement = new AsymmetricSecurityBindingElement();
    securityElement.EnableUnsecuredResponse = true;
    securityElement.IncludeTimestamp = true;
    securityElement.RecipientTokenParameters = new X509SecurityTokenParameters(X509KeyIdentifierClauseType.IssuerSerial, SecurityTokenInclusionMode.Never);
    securityElement.InitiatorTokenParameters = new X509SecurityTokenParameters(X509KeyIdentifierClauseType.IssuerSerial, SecurityTokenInclusionMode.AlwaysToRecipient);
    securityElement.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15;
    securityElement.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
    securityElement.SetKeyDerivation(false);
    securityElement.EndpointSupportingTokenParameters.Signed.Add(userNameToken);
    securityElement.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt;
    securityElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
    binding.Elements.Add(securityElement);

    var encodingElement = new TextMessageEncodingBindingElement();
    encodingElement.MessageVersion = MessageVersion.Soap11WSAddressing10;
    encodingElement.WriteEncoding = Encoding.UTF8;
    encodingElement.ReaderQuotas.MaxArrayLength = 50000000;
    encodingElement.ReaderQuotas.MaxStringContentLength = 50000000;
    binding.Elements.Add(encodingElement);

    var httpsElement = new HttpsTransportBindingElement();
    httpsElement.MaxBufferSize = 50000000;
    httpsElement.MaxReceivedMessageSize = 50000000;
    httpsElement.MaxBufferPoolSize = 50000000;
    httpsElement.UseDefaultWebProxy = true;
    binding.Elements.Add(httpsElement);

    return binding;
}

Теперь меня не волнует, подписан ли этот элемент Action или нет, или вообще его нет, но если взломать ответ на удаление тега в целом, получится сообщение "Для сообщений с действием" не были определены части подписи., исключение.

Как я могу настроить мой клиент так, чтобы он принимал действие и другие элементы адресации в ответном сообщении как они есть? Кроме того, что я могу изменить их, чтобы WCF пропустил их?

1 ответ

Чтобы переопределить проверку по умолчанию удаленного сертификата Secure Sockets Layer (SSL), используемого для аутентификации, укажите это на клиенте:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); 

Чтобы исследовать ошибки сертификата, проверьте параметр sslPolicyErrors делегата RemoteCertificateValidationCallback ( ссылка на справочную страницу MSDN).

Другие вопросы по тегам