Problemas lendo a autenticação de uma asserção SAML no .Net usando WSSecurityTokenSerializer
Tenho uma asserção SAML que desejo autenticar em .Net usandoWSSecurityTokenSerializer
.
Eu tenho o chaveiro e o SAML XML, apesar de algumas edições.
Primeiro, recebo a asserção SAML do HTTPS POST:
// spec says "SAMLResponse="
string rawSamlData = Request["SAMLResponse"];
// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);
// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);
// get the SAML data in an XML reader
var assertionPostStream = new StringReader(samlAssertion);
var reader = XmlReader.Create(assertionPostStream);
Então eu recebo as chaves fornecidas pelo meu IdP:
// get the key data
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b");
// decode the keys
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber);
cms.Decode(certificateData);
// we have a keychain of X509Certificate2s, we need a collection of tokens
var certificatesAsTokens =
from X509Certificate2 cert in cms.Certificates
select new X509SecurityToken(cert) as SecurityToken;
// get a token resolver
var tokens = new ReadOnlyCollection<SecurityToken>(
certificatesAsTokens.ToList());
var resolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
tokens, true);
Finalmente, recebo um erro aqui:
// use the WS Security stuff to parse the reader
var securityToken = WSSecurityTokenSerializer.
DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken;
Quando chamando issoReadToken
Estou tendo o erro a seguir
Não é possível ler o token do elemento 'Response' com o namespace 'urn: oasis: names: tc: SAML: 2.0: protocol' para BinarySecretSecurityToken, com um '' ValueType. Se for esperado que esse elemento seja válido, verifique se a segurança está configurada para consumir tokens com o nome, espaço para nome e tipo de valor especificad
My XML SAML começa com:
<Response xmlns="urn:oasis:names:tc:SAML:2.0:protocol" ...
Então, claramente, eu tenho umResponse
no elementourn:oasis:names:tc:SAML:2.0:protocol
namespace.
Alguma idéia do que está errado / faltando aqu