Ich muss einen gestreamten WCF net.tcp-Dienstendpunkt mit WIF sichern . Es sollte eingehende Anrufe gegen unseren Tokenserver authentifizieren. Der Dienst wird gestreamt, da er für die Übertragung großer Datenmengen ausgelegt ist.
Dies scheint unmöglich zu sein. Und wenn ich den Haken nicht umgehen kann, wird mein Weihnachtsfest ruiniert und ich werde mich in einer Gosse zu Tode trinken, während fröhliche Käufer über meinen langsam abkühlenden Körper treten. Totes ernst, Leute.
Warum ist das unmöglich? Hier ist der Catch-22.
Auf dem Client muss ich einen Kanal mit dem GenericXmlSecurityToken erstellen, das ich von unserem Tokenserver erhalte. Kein Problem.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Habe ich "no problemo" gesagt? Problemo. In der Tat NullReferenceException
Stil problemo.
"Bro", fragte ich das Framework, "prüfst du überhaupt nicht?" Das Framework war still, also habe ich es zerlegt und festgestellt
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
war die Quelle der Ausnahme und dass der GetProperty
Anruf zurückkehrte null
. Also, WTF? Es stellt sich heraus, dass, wenn ich die Nachrichtensicherheit aktiviere und den Clientanmeldeinformationstyp auf setze, IssuedToken
diese Eigenschaft jetzt im ClientFactory
(protip: Es gibt kein "SetProperty" -Äquivalent in IChannel, dem Bastard) vorhanden ist.
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Süss. Keine NREs mehr. Jetzt ist mein Klient jedoch bei der Geburt fehlerhaft (liebe ihn immer noch, tho). Wenn ich die WCF-Diagnose durchforste (Protip: Lassen Sie Ihre schlimmsten Feinde dies tun, nachdem Sie sie niedergeschlagen und vor Ihnen gefahren haben, aber kurz bevor Sie die Wehklagen ihrer Frauen und Kinder genießen), sehe ich, dass dies auf eine Sicherheitslücke zwischen Server und Client zurückzuführen ist.
Das angeforderte Upgrade wird von 'net.tcp: // localhost: 49627 / MyService' nicht unterstützt. Dies kann auf nicht übereinstimmende Bindungen zurückzuführen sein (z. B. auf dem Client und nicht auf dem Server aktivierte Sicherheit).
Wenn ich die Diags des Hosts überprüfe (noch einmal: zerquetschen, fahren, Protokolle lesen, Wehklagen genießen), sehe ich, dass dies wahr ist
Die Protokolltypanwendung / ssl-tls wurde an einen Dienst gesendet, der diese Art der Aktualisierung nicht unterstützt.
"Nun, ich selbst", sagt ich, "ich schalte einfach die Nachrichtensicherheit auf dem Host ein!" Und ich mache. Wenn Sie wissen möchten, wie es aussieht, handelt es sich um eine exakte Kopie der Client-Konfiguration. Sieh nach oben.
Ergebnis: Kaboom.
Die Bindung ('NetTcpBinding', ' http://tempuri.org/ ') unterstützt Streaming, das nicht zusammen mit der Sicherheit auf Nachrichtenebene konfiguriert werden kann. Wählen Sie einen anderen Übertragungsmodus oder die Sicherheit auf Transportebene.
So kann mein Gastgeber nicht beide gestreamten und gesichert über Token sein . Fang-22.
tl; dr: Wie kann ich einen gestreamten net.tcp WCF-Endpunkt mit WIF sichern?
TransportWithMessageCredential
Modus kann eine andere Option sein.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>