У меня есть утверждение SAML, которое я хочу аутентифицировать в .Net, используя WSSecurityTokenSerializer
.
У меня есть цепочка ключей и SAML XML, несмотря на несколько проблем .
Сначала я получаю утверждение SAML из 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);
Затем я получаю ключи, предоставленные моим 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);
Наконец я получаю ошибкуздесь:
// use the WS Security stuff to parse the reader
var securityToken = WSSecurityTokenSerializer.
DefaultInstance.ReadToken(reader, resolver) as SamlSecurityToken;
При вызове этого ReadToken
я получаю следующую ошибку:
Невозможно прочитать токен из элемента 'Response' с помощью 'urn: oasis:names: tc: SAML: 2.0: пространство имен протокола 'для BinarySecretSecurityToken, с' 'ValueType.Если предполагается, что этот элемент допустим, убедитесь, что система безопасности настроена на использование токенов с указанным именем, пространством имен и типом значения.
Мой SAML XML начинается с:
<Response xmlns="urn:oasis:names:tc:SAML:2.0:protocol" ...
Ясно, что у меня есть элемент Response
в пространстве имен urn:oasis:names:tc:SAML:2.0:protocol
.
Есть идеи, что здесь не так?