WIF 4.5-BootstrapContext-Sicherheitstoken null

Ich verwende das neue 4.5 WIF-Zeug, um Benutzer der Website zu authentifizieren und die Kommunikation zwischen meiner MVC-Website und den WCF-Diensten zu sichern.

Ich habe die Website so konfiguriert, dass der Bootstrap-Kontext gespeichert wird, damit ich dasselbe Sicherheitstoken für alle Anforderungen an die Service-Schicht wiederverwenden kann.

Unter normalen Umständen funktioniert alles einwandfrei, wenn jede Website-Anfrage authentifiziert und das SecurityToken über den Kontext zur Sicherung der WCF-Aufrufe verfügbar gemacht wird.

Wenn jedoch die Website-App-Domain zurückgesetzt wird (z. B. das Erstellen der App während der Entwicklung), werden alle Anforderungen an die Website weiterhin authentifiziert, aber das SecurityToken ist im Kontext nicht mehr verfügbar, um an die WCF-Aufrufe weitergeleitet zu werden.

Debuggen derBootstrapContext Es hat 4 nützliche Eigenschaften:

SecurityToken
SecutiryTokenHandler
Token
TokenBytes

Vor dem Zurücksetzen der App-Domäne hat SecurityToken und SecurityTokenHandler Werte, und nach dem Zurücksetzen hat Token einen Wert.

Den Wert für Token nach dem Zurücksetzen in Augenschein zu nehmen, sieht so aus, als wäre dies das unformatierte SAML-XML, sodass ich vermutlich ein vollständiges SecutiryToken daraus rehydrieren kann, aber dies scheint ein seltsames Verhalten zu sein, zu dem ich keine Dokumentation finde.

Haben Sie eine Idee, wie ich sicherstellen kann, dass das SecurityToken immer verfügbar ist, damit ich nicht mit dem Token XML herumalbern muss?

Aktualisieren

Mit dotPeek konnte ich nachvollziehen, was im Framework-Quellcode vor sich geht. Ich konnte den Ausführungspfad ermitteln, der dieses Verhalten verursacht, aber ich konnte keinen Grund feststellen, warum dies so sein musste und wie es vermieden werden konnte.

Am Ende habe ich es aufgegeben, es auszuarbeiten und benutze jetzt den folgenden Code, um sicherzustellen, dass ich ein Token habe

if (context.SecurityToken != null)
{
    token = context.SecurityToken;
}
else if (context.Token.IsNotEmpty())
{
    var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;
    token = handlers.ReadToken(new XmlTextReader(new StringReader(context.Token)));
}

Was mich jetzt beunruhigt, ist, dass ich einige Argumente hinter diesem Behaiour verpasst habe und mein Fix darüber irgendwann in die Luft jagen wird.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage