Ho un requisito per proteggere un endpoint del servizio WCF net.tcp in streaming tramite WIF . Dovrebbe autenticare le chiamate in arrivo sul nostro server token. Il servizio è trasmesso in streaming perché è progettato per trasferire grandi quantità di dati e roba.
Questo sembra impossibile. E se non riesco a aggirare il pescato, il mio Natale sarà rovinato e mi berrò a morte in una grondaia mentre gli acquirenti allegri calpestano il mio corpo che si raffredda lentamente. Totalmente seri, ragazzi.
Perché è impossibile? Ecco il Catch-22.
Sul client, devo creare un canale con GenericXmlSecurityToken che ottengo dal nostro server token. Nessun problema.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Ho detto "no problemo"? Problemo. In effetti, NullReferenceException
stile problemo.
"Fratello", ho chiesto al Framework, "controlli anche nulla?" Il Framework era silenzioso, quindi l'ho smontato e l'ho scoperto
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
era la fonte dell'eccezione e che la GetProperty
chiamata stava tornando null
. Quindi, WTF? Si scopre che se accendo la sicurezza dei messaggi e imposto il tipo di credenziali del client su IssuedToken
allora questa proprietà esiste ora nel ClientFactory
(protip: non esiste un equivalente "SetProperty" in IChannel, il bastardo).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Dolce. Niente più NRE. Tuttavia, ora il mio cliente è in errore alla nascita (lo adoro ancora, comunque). Scavando attraverso la diagnostica WCF (protip: fai in modo che i tuoi peggiori nemici lo facciano dopo averli schiacciati e guidati davanti a te ma proprio prima di godere dei lamenti di donne e bambini), vedo che è a causa di una mancata corrispondenza di sicurezza tra server e client.
L'aggiornamento richiesto non è supportato da "net.tcp: // localhost: 49627 / MyService". Ciò potrebbe essere dovuto a associazioni non corrispondenti (ad esempio sicurezza abilitata sul client e non sul server).
Controllando i diag dell'host (di nuovo: schiaccia, guida, leggi i log, goditi i lamenti), vedo che è vero
Tipo di protocollo application / ssl-tls è stato inviato a un servizio che non supporta quel tipo di aggiornamento.
"Beh, io stesso", dico, "Attiverò la sicurezza dei messaggi sull'host!" E io faccio. Se vuoi sapere come appare, è una copia esatta della configurazione del client. Consultare.
Risultato: Kaboom.
L'associazione ('NetTcpBinding', ' http://tempuri.org/ ') supporta lo streaming che non può essere configurato insieme alla sicurezza a livello di messaggio. Prendi in considerazione la scelta di una modalità di trasferimento diversa o la sicurezza del livello di trasporto.
Pertanto, il mio host non può essere trasmesso in streaming e protetto tramite token . Prendi il 22.
tl; dr: come posso proteggere un endpoint WCF net.tcp in streaming usando WIF ???
TransportWithMessageCredential
la modalità potrebbe essere un'altra opzione.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>