2011-09-06 24 views
7

Cuando uso WCF y C# en un proyecto, recibo una excepción, MesssageSecurityException, con el mensaje "El encabezado de seguridad está vacío". Aquí sigue la respuesta (según MS Visor de seguimiento de servicio):C# .NET 4.0 WCF MessageSecurityException, "El encabezado de seguridad está vacío". al consumir un servicio

<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> 

De hecho, la cabecera de seguridad es "vacío", pero sigue siendo correcta accprding a la definición cabecera de seguridad por lo que yo puedo decir.

También he intentado editar los enlaces, pero eso no parece ayudar también. También encontré un problema similar donde habilitar EnableUnsecuredResponse ayudaría, pero aquí no.

Aquí está la respuesta según 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> 

Ellos son casi idénticas, excepto por la forma en que cierran la cabecera de seguridad. ¿Qué es interesante, pero no debería plantear la excepción?

También encontré un similar problem donde la solución era crear un codificador de mensajes personalizado y quitar todo el encabezado de seguridad, aunque esto funcionaría es un paso innecesario adicional. ¿Es esa la única forma de hacerlo con .Net y WCF? ¿WCF no puede manejar los encabezados de seguridad sin contenido?

EDITAR: Aclaración de la cuestión, ¿está escribiendo un codificador que deja caer el encabezado de seguridad de la única manera de recibir y analizar mensajes SOAP con encabezados de seguridad vacíos utilizando WCF?

Edit2: Adición parte de 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> 

Por lo que yo sé, su configuración para permitir que prácticamente todo?

+0

¿Qué es la configuración de seguridad de su cliente? ¿Estás consumiendo WCF o servicio que no es WCF? Whey es el encabezado de seguridad incluido incluso si está vacío? ¿Qué seguridad se usa en la solicitud? –

+0

Conf de seguridad, básicamente solo 'UserNameOverTransport' y https-transport binding, el resto no debería importar de acuerdo con ws-spec (y he revisado cada configuración de App.config AFAIK). Non-WCF por SOAP. ¿Por qué el encabezado está incluido? ¿No tengo idea? Pero mi cliente solo está consumiendo el servidor. Seguridad en req, lo mismo que conf. La pregunta es realmente esta: ¿tiene que escribir un codificador de mensajes personalizado o puede configurar WCF de alguna manera para soltar el encabezado de seguridad sin implementar un codificador? – flindeberg

+1

¿Quiere decir que está utilizando el Modo de seguridad = Transporte o TransportWithMessageCredential? –

Respuesta

4

(Ahora estoy respondiendo a mi propia pregunta desde que he sido capaz de obtener algún tipo de respuesta)

En resumen, no, no puedes usar WCF "fuera de la caja" (es decir, a través *. config) con servidores de aplicaciones que proporcionan encabezados de seguridad vacíos en las respuestas. Debe implementar un codificador que modifique los mensajes a un formato aceptable por WCF-framework.

Para obtener más información, lea this blog que contiene una guía bastante buena del codificador y sus aplicaciones. This blog (another blog) también proporciona un fragmento de código capaz de resolver mi problema, es decir, modificar el encabezado de seguridad.

Me pregunto por qué los productos MS y Oracle nunca pueden coexistir pacíficamente: D

+0

La pregunta es si la especificación WS-Security permite que este encabezado esté vacío. No encontré una respuesta clara para eso. –

+0

Ni yo tampoco, pero no hay nada que indique que ** no ** puede estar vacío y contener un atributo mustUnderstand establecido en _true_. – flindeberg

Cuestiones relacionadas