Quando si utilizza WCF e C# in un progetto ottengo un'eccezione, MesssageSecurityException, con il messaggio "L'intestazione di sicurezza è vuota.". Qui di seguito la risposta (in base a MS Servizio Trace Viewer):C# .NET 4.0 WCF MessageSecurityException, "L'intestazione di sicurezza è vuota." quando si consuma un servizio
<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>
In effetti, l'intestazione di protezione è "vuoto", ma è ancora corretta accprding alla definizione intestazione di protezione per quanto posso dire.
Ho anche provato a modificare i binding, ma questo non sembra essere di aiuto. Ho anche trovato un problema simile in cui abilitare EnableUnsecuredResponse
sarebbe di aiuto, ma non qui.
Ecco la risposta in base alla 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>
Essi sono quasi identiche, tranne che per il modo in cui chiudono l'intestazione di sicurezza. Quale è interessante, ma non dovrebbe sollevare l'eccezione?
Ho trovato anche un similar problem in cui la soluzione era quella di creare un codificatore di messaggi personalizzato e rimuovere l'intera intestazione di sicurezza, anche se questo avrebbe funzionato è un passo aggiuntivo non necessario. È questo l'unico modo per farlo con .Net e WCF? WCF non può gestire le intestazioni di sicurezza senza contenuto?
MODIFICA: Chiarimento del problema, sta scrivendo un codificatore che elimina l'intestazione di sicurezza l'unico modo per ricevere e analizzare i messaggi SOAP con le intestazioni di sicurezza vuote usando WCF?
EDIT2: Aggiunta parte di 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>
Per quanto ne so, la sua configurazione da consentire praticamente tutto?
Qual è la configurazione di sicurezza del client? Stai consumando servizi WCF o non-WCF? Whey è l'header di sicurezza incluso anche se è vuoto? Quale sicurezza viene utilizzata in richiesta? –
Conf. Sicurezza, basicamente solo 'UserNameOverTransport' e https-transport binding, il resto non dovrebbe importare secondo ws-spec (e ho esaminato ogni singola impostazione di App.config AFAIK). Non-WCF di SOAP. Perché l'intestazione è inclusa? Non ne ho idea? Ma il mio cliente sta solo consumando il server. Sicurezza in req, come conf. La domanda è davvero questa: devi scrivere un codificatore di messaggi personalizzato o puoi configurare WCF in qualche modo per eliminare l'intestazione di sicurezza senza implementare un encoder? – flindeberg
Vuoi dire che stai utilizzando la Modalità sicurezza = Trasporto o TransportWithMessageCredential? –