Проблемы с чтением проверки подлинности утверждения SAML в .Net с использованием WSSecurityTokenSerializer - PullRequest
3 голосов
/ 24 мая 2011

У меня есть утверждение 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.

Есть идеи, что здесь не так?

1 Ответ

5 голосов
/ 31 декабря 2013

Похоже, вы получаете ответ SAML2. Хотя в .NET 4.5 поддерживается SAML2, к сожалению, поддерживается только поддержка утверждений, а не сам протокол (включая ответное сообщение).

Для обработки ответа SAML2 в .NET необходимо:

  1. Проверка подписи на всем ответном сообщении.
  2. Извлеките утвержденную часть сообщения.
  3. Прочитайте токен с Saml2SecurityTokenHandler.ReadToken().
  4. Подтвердите токен с помощью Saml2SecurityTokenHandler.DetectReplayedToken().
  5. Подтвердите токен с помощью Saml2SecurityTokenHandler.ValidateConditions()
  6. Используйте Saml2SecurityTokenHandler.CreateClaims() для создания идентификатора заявки.

К сожалению, большинство из этих методов защищены, но вы можете создать подкласс Saml2SecurityTokenHandler и получить к ним доступ.

Полный рабочий пример можно найти в классе Saml2Response в проекте Sustainsys.Saml2 .

...