Есть ли способ сказать WCF использовать безопасность в запросе, но игнорировать его в ответе? - PullRequest
2 голосов
/ 15 сентября 2008

Мы должны подключиться к стороннему сервису SOAP, и мы используем WCF для этого. Сервис был разработан с использованием Apache AXIS, и мы не можем его контролировать и не можем повлиять на его работу. Проблема, которую мы видим, состоит в том, что она ожидает, что запросы будут отформатированы с использованием безопасности веб-служб, поэтому мы делаем все правильные подписи и т. Д. Однако ответ третьей стороны не защищен. Если мы нюхаем провод, мы видим, что ответ возвращается в порядке (хотя и без отметки времени, подписи и т. Д.). Базовые компоненты .NET выдают это как ошибку, потому что она видит это как проблему безопасности, поэтому мы фактически не получаем ответ мыла как таковой. Есть ли способ настроить инфраструктуру WCF для отправки защищенных запросов, но не ожидать поля безопасности в ответе? Глядя на спецификации OASIS, не представляется обязательным, чтобы ответы были безопасными.

Для информации вот исключение, которое мы видим:

Исключение, которое мы получаем:

System.ServiceModel.Security.MessageSecurityException was caught
  Message="Security processor was unable to find a security header in the message. This might be because the message is an unsecured fault or because there is a binding mismatch between the communicating parties.   This can occur if the service is configured for security and the client is not using security."
  Source="mscorlib"
  StackTrace:
    Server stack trace:
       at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessageCore(Message& message, TimeSpan timeout)
       at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout)
       at System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout, SecurityProtocolCorrelationState[] correlationStates)
       at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
       at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
       at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)

Между прочим, я видел много сообщений, в которых говорится, что если вы оставите отметку времени, то поля безопасности не ожидаются. Это не вариант - служба, с которой мы общаемся, с отметками времени мандатов.

Ответы [ 3 ]

3 голосов
/ 09 июля 2009

У Microsoft есть исправление для этой функции.

http://support.microsoft.com/kb/971493

2 голосов
/ 15 сентября 2008

Есть большая вероятность, что вам не удастся сойти с рук в одиночку. Мне пришлось выполнить некоторую интеграционную работу с Axxis (нашим концом был WSE3 - предок WCF), и мне пришлось написать некоторый код и вставить его в конвейер WSE3, чтобы обработать ответ от Axxis перед передачей его в WSE3. Хорошей новостью является то, что добавить эти обработчики в конвейер довольно просто, и, попав в обработчик, вы просто получаете экземпляр SoapMessage и можете делать с ним все, что захотите (например, удалить метку времени)

2 голосов
/ 15 сентября 2008

Забавно, вы должны задать этот вопрос. Я спросил Microsoft, как это сделать около года назад. В то время, используя .NET 3.0, это было невозможно. Не уверен, что это изменилось в мире 3.5. Но нет, не было никакого физического способа добавить защиту к запросу и оставить ответ пустым.

У моего предыдущего работодателя мы использовали модель, которая требовала заголовок WS-Security с использованием сертификатов в запросе, но ответ остался незащищенным.

Это можно сделать с помощью веб-служб ASMX и WSE, но не с WCF v3.0.

...