2011-05-23 32 views
5

Estoy tratando de implementar una solución SAML SSO en .Net, pero estoy teniendo un problema al analizar la afirmación.cómo analizar una solicitud aserción SAML en .Net

Tengo una aserción de muestra (se parece a byte[] datos como texto) y el archivo correspondiente .p7b.

quiero cargar las claves de la .p7b y descifrar la afirmación de un documento XML.

hasta ahora creo que estoy leyendo las teclas correctamente:

// get the key data 
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b"); 

// decode the keys 
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber); 
cms.Decode(certificateData); 

var samlCertificates = cms.Certificates; 

entonces trato de analizar la afirmación consigo un problema:

// we have a keychain of X509Certificate2s, we need a collection of tokens 
var certificatesAsTokens = 
    from X509Certificate2 cert in samlCertificates 
    select new X509SecurityToken(cert) as SecurityToken; 

// get a token resolver 
var tokens = new ReadOnlyCollection<SecurityToken>(
    certificatesAsTokens.ToList()); 
var resolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
    tokens, true); 

// get the SAML data in an XML reader 
var reader = XmlReader.Create(assertionPostStream); 

// use the WS Security stuff to parse the reader 
var securityToken = WSSecurityTokenSerializer. 
    DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken; 

Esta última afirmación se produce una excepción, expresando que no puede analizar el contenido XML.

Creo que esto significa que me falta un paso para descifrar la afirmación: obtener el byte[] como texto convertido a un documento XML en formato SAML.

Alguien sabe cómo añadir este paso? ¿Me estoy perdiendo algo más?

Respuesta

12

He cuenta de esto - me estaba perdiendo parte de la especificación SAML.

La afirmación se envía (en lugar extrañamente, ya que no está cifrado) como datos de base64, y que estaba siendo URL codificada dos veces en que fue enviado.

por lo que añadir este paso nos da una afirmación válida:

// spec says "SAMLResponse=" 
string rawSamlData = Request["SAMLResponse"]; 

// the sample data sent us may be already encoded, 
// which results in double encoding 
if (rawSamlData.Contains('%')) 
{ 
    rawSamlData = HttpUtility.UrlDecode(rawSamlData); 
} 

// read the base64 encoded bytes 
byte[] samlData = Convert.FromBase64String(rawSamlData); 

// read back into a UTF string 
string samlAssertion = Encoding.UTF8.GetString(samlData); 

El authentication still isn't working, pero ahora tengo XML válido por lo que es un problema diferente.

+2

Gracias por publicar la forma en que lo tienes trabajo. Simplemente me ahorró mucho tiempo. –

Cuestiones relacionadas