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

Я получаю доступ к внешней веб-службе на основе Java, которую я не контролирую с помощью клиента WCF, используя двойные сертификаты для шифрования и подписи, а также настраиваемую привязку. Я получаю успешный ответ от сервера, но WCF выдает исключение MessageSecurityException: The 'Action', '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 или нет, или даже если его нет вообще, но взлом ответа для полного удаления тега приводит к тому, что для сообщений с "действие." исключение.

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


person user3349365    schedule 14.03.2014    source источник


Ответы (1)


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

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

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

person BolandT    schedule 14.03.2014
comment
К сожалению, это не сработало - параметр sslPolicyErrors имеет значение None. Проблема не в сертификатах, я не думаю, а в формате ответного сообщения, проверку которого я хочу отключить. - person user3349365; 17.03.2014