J'ai besoin de sécuriser un point d'extrémité de service WCF net.tcp en flux continu à l'aide de WIF . Il doit authentifier les appels entrants par rapport à notre serveur de jetons. Le service est en flux continu car il est conçu pour transférer de grandes quantités de données.
Cela semble impossible. Et si je n'arrive pas à contourner la prise, mon Noël sera gâché et je vais boire jusqu'à la mort dans un caniveau pendant que les joyeux clients enjambent mon corps qui se refroidit lentement. Très sérieux, les gars.
Pourquoi est-ce impossible ? Voici l'impasse.
Sur le client, je dois créer un canal avec l'option GénériqueXmlSecurityToken que je reçois de notre serveur de jetons. Pas de problème.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Ai-je dit "no problemo" ? Problemo. En fait, NullReferenceException
style problemo.
"Frère," j'ai demandé au Cadre, "est-ce que tu as même un chèque nul ?" Le Framework était silencieux, alors j'ai démonté et trouvé que
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
était la source de l'exception, et que la GetProperty
l'appel retournait null
. Alors, WTF ? Il s'avère que si j'active la sécurité des messages et que je règle le type de justificatif client sur IssuedToken
alors cette propriété existe maintenant dans le ClientFactory
(protip : Il n'y a pas d'équivalent "SetProperty" dans IChannel, le bâtard).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Doux. Plus de NREs. Cependant, mon client est maintenant fautes à la naissance (je l'aime toujours, tho). En fouillant dans les diagnostics WCF (protip : faites faire ça à vos pires ennemis après les avoir écrasés et chassés devant vous mais juste avant de profiter des lamentations de leurs femmes et enfants), je vois que c'est à cause d'un problème de sécurité entre le serveur et le client.
La mise à niveau demandée n'est pas prise en charge par 'net.tcp://localhost:49627/MyService'. Cela peut être dû à des liaisons incompatibles (par exemple, la sécurité est activée sur le client mais pas sur le serveur).
En vérifiant les diags de l'hôte (encore une fois : écraser, conduire, lire les logs, se lamenter), je vois que ceci est vrai
Le protocole de type application/ssl-tls a été envoyé à un service qui ne prend pas en charge ce type de mise à niveau.
"Eh bien, self", je dis, "Je vais juste activer la sécurité des messages sur l'hôte !" Et je le fais. Si vous voulez savoir à quoi ça ressemble, c'est une copie exacte de la configuration du client. Regarde.
Résultat : Kaboom.
Le binding ('NetTcpBinding',' http://tempuri.org/ ') prend en charge le streaming qui ne peut être configuré avec la sécurité au niveau des messages. Envisagez de choisir un autre mode de transfert ou de choisir la sécurité au niveau du transport.
Donc, mon hôte ne peut pas être à la fois diffusé en continu et sécurisé par des jetons. . Catch-22.
tl;dr : Comment puis-je sécuriser un point de terminaison WCF net.tcp streamé en utilisant WIF ???