2015-01-15 6 views
1

Я читаю ответ Okta на приложение следующим образом. Пожалуйста, дайте мне знать, есть ли пакет nuget или класс opensource для чтения атрибутов.Чтение атрибута ответа OTPA SAML из пакета nuget или класса openource

 var xml = HttpContext.Request.Form["SAMLResponse"]; 
     byte[] byteData = Convert.FromBase64String(xml); 
     string samlXmlString = Encoding.UTF8.GetString(byteData); 
     var stream = new StringReader(samlXmlString); 
     var xmlReader = XmlReader.Create(stream); 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(samlXmlString); 
     var emailElement = doc.GetElementsByTagName("saml2:NameID"); 
     var attributes = doc.GetElementsByTagName("saml2:Attribute"); 
     var attributesValues = doc.GetElementsByTagName("saml2:AttributeValue"); 
     var username = emailElement[0].InnerText; 
     var role = attributesValues[0].InnerText; 

ответ

0

Не сразу разобрать SAML ответов. Это критический, что вы проверяете XML Signature на ответы SAML. В противном случае несанкционированному пользователю будет легко войти в систему с помощью SAML.

Мне не удалось найти хороший пакет NuGet или Open Source для синтаксического анализа SAML в .NET. Поэтому я рекомендую использовать SAML v2.0 SSO component из ComponentSpace. После того, как пакет ComponentSpace настроен, разбор ответа SAML так же просто, как это:

bool isInResponseTo = false; 
string partnerIdP = null; 
string userName = null; 
IDictionary<string, string> attributes = null; 
string targetUrl = null; 

try 
{ 
    SAMLServiceProvider.ReceiveSSO(Request, out isInResponseTo, out partnerIdP, out userName, out attributes, out targetUrl); 
} 
catch (ComponentSpace.SAML2.Exceptions.SAMLException exception) 
{ 
    throw exception; 
} 

В примере кода выше, атрибуты от ответа SAML будет в attributes IDictionary.

Если у вас есть компонент SSO SAML v2.0 установлен в папку по умолчанию в вашей системе, вы найдете больше примеров в атрибутах ответа C:\Program Files (x86)\ComponentSpace SAML v2.0 for .NET\Examples\SSO\HighLevelAPI\MVC\MvcExampleServiceProvider\Controllers

1

SAML может быть считан из следующего кода.

var responseDecoded = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(HttpUtility.HtmlDecode(HttpContext.Current.Request.Form["SAMLResponse"]))); 

     // Pick out the token 
     using (StringReader sr = new StringReader(responseDecoded)) 
     { 
      using (XmlReader reader = XmlReader.Create(sr)) 
      { 
       reader.ReadToFollowing("Assertion", "urn:oasis:names:tc:SAML:2.0:assertion"); 

       // Deserialize the token so that data can be taken from it and plugged into the RSTR 
       SecurityTokenHandlerCollection coll = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection(); 
       token = (Saml2SecurityToken)coll.ReadToken(reader.ReadSubtree()); 
      } 
     } 

     if (token != null) 
     { 
      UserName = token.Assertion.Subject.NameId.Value; 
      Issuer = token.Assertion.Issuer.Value; 

      var saml2Statement = token.Assertion.Statements.FirstOrDefault(x => x.GetType() == new Saml2AttributeStatement().GetType()); 
      if (saml2Statement != null) 
      { 
       var attributes = ((Saml2AttributeStatement)saml2Statement).Attributes; 
       if (attributes != null) 
       { 
        if (attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("firstname")) != null) 
         FirstName = attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("firstname")).Values.FirstOrDefault(); 

        if (attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("lastname")) != null) 
         LastName = attributes.FirstOrDefault(x => x.Name.ToString().ToLower().Equals("lastname")).Values.FirstOrDefault(); 
       } 
      } 
     }