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();