4 votes

Extraire le jeton de sécurité de l'assertion SAML

J'ai le XML d'une Assertion SAML qui ressemble à ceci :

...

J'essaie d'extraire un SecurityToken de ce XML en utilisant un code similaire au suivant :

// Chargement du XML référencé ci-dessus.
XDocument doc = XDocument.Load(new StringReader(assertion));

// Création d'une configuration à utiliser dans les manipulateurs de jetons ci-dessous ; requise si on n'utilise pas une SecurityTokenHandlerCollection.
SecurityTokenHandlerConfiguration config = new SecurityTokenHandlerConfiguration();
config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("https://localhost/Orchard/"));
config.CertificateValidator = X509CertificateValidator.None;

// Les deux lignes suivantes lancent des exceptions, comme expliqué ci-dessous.
new Saml11SecurityTokenHandler() { Configuration = config }.ReadToken(doc.CreateReader());
new Saml2SecurityTokenHandler() { Configuration = config }.ReadToken(doc.CreateReader());

Si j'essaie de lire le jeton en utilisant le Saml11SecurityTokenHandler, j'obtiens l'exception suivante :

ID4075: L'Assertion SAML ne comporte pas l'Attribut 'MajorVersion' requis.

Si j'essaie de lire le jeton en utilisant le Saml2SecurityTokenHandler, j'obtiens une exception différente :

L'élément 'Assertion' avec l'espace de noms 'urn:oasis:names:tc:SAML:2.0:assertion' n'a pas été trouvé.

Évidemment, celle pour Saml2SecurityTokenHandler a du sens, puisqu'il s'agit d'une Assertion SAML 1.1. Cependant, pourquoi le manipulateur de jetons SAML 1.1 ne peut-il pas lire cette Assertion ?

ÉDIT : Le lecteur semble être vide ; pourquoi est-ce le cas ? doc a du contenu.

string notEmpty = doc.FirstNode.ToString();
string empty = doc.CreateReader().ReadOuterXml();

7voto

zimdanen Points 3238

En s'inspirant de la technique illustrée ici, cela fonctionne :

SecurityToken token;
using (StringReader sr = new StringReader(assertion))
{
    using (XmlReader reader = XmlReader.Create(sr))
    {
        if (!reader.ReadToFollowing("saml:Assertion"))
        {
            throw new Exception("Assertion not found!");
        }
        SecurityTokenHandlerCollection collection = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();
        token = collection.ReadToken(reader.ReadSubtree());
    }
}

Assurez-vous de ne pas changer les espaces blancs dans le document XML, sinon vous obtiendrez une erreur de vérification de la signature.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X