C # .NET 4.0 WCF MessageSecurityException, «Заголовок безопасности пуст».при использовании услуги - PullRequest
7 голосов
/ 06 сентября 2011

При использовании WCF и C # в проекте я получаю исключение MesssageSecurityException с сообщением «Заголовок безопасности пуст».Далее следует ответ (согласно MS Service Trace Viewer):

    <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="true"></wsse:Security>
        <wsa:Action>_WHAT_I_DID_</wsa:Action>
        <wsa:RelatesTo>_MSG_ID_OF_REQUEST_</wsa:RelatesTo>
      </soapenv:Header>
      <soapenv:Body>
        _CORRECT_BODY_
      </soapenv:Body>
    </soapenv:Envelope>

Действительно, заголовок безопасности «пустой», но, насколько я могу судить, он все еще корректен в соответствии с определением заголовка безопасности.

Я также пытался редактировать привязки, но это, похоже, тоже не помогает.Я также обнаружил аналогичную проблему, когда включение EnableUnsecuredResponse может помочь, но это не так.

Вот ответ в соответствии с SoapUI:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <soapenv:Header>
      <wsse:Security soapenv:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"/>
      <wsa:Action>_WHAT_I_DID_</wsa:Action>
      <wsa:RelatesTo>_REQ_MSG_ID_</wsa:RelatesTo>
   </soapenv:Header>
   <soapenv:Body>
      _CORRECT_BODY_
   </soapenv:Body>
</soapenv:Envelope>

Они почти идентичны, за исключениемза то, как они закрывают заголовок безопасности.Что интересно, но не должно вызывать исключение?

Я также обнаружил аналогичную проблему , где было решено создать собственный кодировщик сообщений и убрать весь заголовок безопасности, хотя это сработало быэто лишний ненужный шаг.Это единственный способ сделать это с .Net и WCF?Разве WCF не может обрабатывать заголовки безопасности без содержимого?

РЕДАКТИРОВАТЬ: Разъяснение проблемы, запись кодировщика, который удаляет заголовок безопасности, единственный способ получать и анализировать SOAP-сообщения с пустыми заголовками безопасности с использованием WCF?1018 *

EDIT2: Добавление части conf:

    <binding name="NinjaBinding">
      <security allowSerializedSigningTokenOnReply="true" enableUnsecuredResponse="true"
      authenticationMode="UserNameOverTransport" requireDerivedKeys="false"
      securityHeaderLayout="Lax" includeTimestamp="false" allowInsecureTransport="true"
      keyEntropyMode="ClientEntropy"
      messageProtectionOrder="SignBeforeEncryptAndEncryptSignature"
    messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
      requireSecurityContextCancellation="false">
        <localServiceSettings detectReplays="false" />
        <secureConversationBootstrap _IDENTICAL_TO_ABOVE_
        </secureConversationBootstrap>
      </security>
      <textMessageEncoding />
      <httpsTransport />
    </binding>

Насколько я знаю, его настроить, чтобы разрешить практически все?

1 Ответ

4 голосов
/ 13 сентября 2011

(сейчас я отвечаю на свой вопрос, так как смог получить какой-то ответ)

Короче говоря, нет, вы не можете использовать WCF "из коробки" (т.е. через * .config) с серверами приложений, которые предоставляют пустые заголовки безопасности в ответах . Вы должны реализовать кодировщик, который изменяет сообщения в формат, приемлемый для WCF-инфраструктуры.

Для получения дополнительной информации прочитайте этот блог , в котором содержится довольно хорошее руководство по кодировщику и его приложениям. Этот блог (другой блог) также предоставляет фрагмент кода, способный решить мою проблему, то есть изменить заголовок безопасности.

Интересно, почему продукты MS и Oracle никогда не могут мирно сосуществовать: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...