2016-10-10 16 views
0

Я делаю POC в ASP.Net для IdP Инициированный SSO. Я успешно зарегистрировался с учетными данными AD на странице входа в ADFS. Но, на моей странице утверждения, как я могу получить ответ SAML и проверить пользователя? Я вижу ответ, используя инструмент разработчика, но как я могу получить его с помощью C#?Как читать ответ SAML?

То, что я пробовал:

Я пытался печати значения из SAMLResponse QueryString параметра (я нашел это где-то после того, как не прибегая к помощи так уверен, как это на самом деле работает.).

ClaimsPrincipal claimsPrincipal = System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal; 

Response.Write("Is user Authenticated = " + claimsPrincipal.Identity.IsAuthenticated.ToString()); 

Я получаю это так: Ложные

Response.Write(" Current Principal = " + System.Threading.Thread.CurrentPrincipal.ToString()); 

Я получаю это так: System.Security.Principal.GenericPrincipal

string rawSamlData = Request["SAMLResponse"]; 
Response.Write("Raw data \n"); 
Response.Write(rawSamlData); 

rawSamlData = HttpUtility.UrlDecode(rawSamlData); 
Response.Write("after url decode \n"); 
Response.Write(rawSamlData); 

// read the base64 encoded bytes 
byte[] samlData = Convert.FromBase64String(rawSamlData); 
Response.Write("after base 64 \n"); 
Response.Write(samlData); 

// read back into a UTF string 
string samlAssertion = Encoding.UTF8.GetString(samlData); 
Response.Write("saml assertion \n"); 
Response.Write(samlAssertion); 

Все, что я получаю некоторые зашифрованная строка , Как я могу декодировать его в ответ SAML и аутентифицировать пользователя?

ответ

0

Если ваш SAML настроен на шифрование токена, вы не можете прочитать его без доступа к сертификатам.

В противном случае это просто Base64. Есть много онлайн-сайтов, которые будут декодировать SAML для вас, чтобы вы могли видеть, как это выглядит.

Вместо того, чтобы самостоятельно использовать SAML clent side stack, как Kentor, который сделает все это за вас.

0

У меня была такая же проблема, и выяснилось, что ADFS отправляет сжатие отклика. Используйте следующие распаковывать:

public static Stream Decompress(this byte[] input) 
{ 
     var output = new MemoryStream(); 

     using (var compressStream = new MemoryStream(input)) 
     using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress)) 
      decompressor.CopyTo(output); 

     output.Position = 0; 
     return output; 
} 

И тогда вы получите XML-строку со следующим:

  var decompressedStream = data.Decompress(); 
      StreamReader reader = new StreamReader(decompressedStream); 
      decodedSaml = reader.ReadToEnd();