2013-04-29 4 views
4

У меня есть XML из в SAML утверждения, что выглядит следующим образом:Вытащите SecurityToken из SAML Assertion

<saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="_9b6e6302-d6a8-47f0-9155-1051a05edbfb" Issuer="http://example.com/adfs/services/trust" IssueInstant="2013-04-29T19:35:51.197Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"> 
... 
</saml:Assertion> 

Я пытаюсь получить SecurityToken из этого XML, используя код, подобный следующему:

// Loading the XML referenced above. 
XDocument doc = XDocument.Load(new StringReader(assertion)); 

// Creating config to use in TokenHandlers below; required if not using a SecurityTokenHandlerCollection. 
SecurityTokenHandlerConfiguration config = new SecurityTokenHandlerConfiguration(); 
config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("https://localhost/Orchard/")); 
config.CertificateValidator = X509CertificateValidator.None; 

// Both of these lines throw Exceptions, as explained below. 
new Saml11SecurityTokenHandler() { Configuration = config }.ReadToken(doc.CreateReader()); 
new Saml2SecurityTokenHandler() { Configuration = config }.ReadToken(doc.CreateReader()); 

Если я пытаюсь прочитать маркер с помощью Saml11SecurityTokenHandler, я получаю следующее исключение:

ID4075: SAML утверждение неверно пойте требуемый атрибут MajorVersion.

Если я пытаюсь прочитать маркер с помощью Saml2SecurityTokenHandler, я получаю различные исключения:

элемент «Утверждение» с именем пространства имен «урновыми: оазис: Названия: дц: SAML: 2.0: утверждение ' не был найден.

Очевидно, что для Saml2SecurityTokenHandler имеет смысл, так как это утверждение SAML 1.1. Однако почему SAML 1.1 TokenHandler не может прочитать это утверждение?

EDIT: Читатель кажется пустым; почему это? doc - контент.

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

Попробуйте использовать XDocument.LoadXML вместо –

+0

@Stefan: документ имеет данные; это либо читатель, либо то, как код получал данные от читателя, который этого не делает. Однако я нашел ответ, который работает (ниже). – zimdanen

ответ

7

Исходя из методики, показанной here, это работает:

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

Убедитесь, что вы не меняете из пробелов в документе XML, в противном случае вы получите сообщение об ошибке проверки подписи.

Смежные вопросы