2013-08-27 3 views
2

У меня есть сервер ADFS как IdP. У меня есть отдельное приложение SP. Они определены в круге доверия. SSO по протоколу SAML работает нормально. Когда я пытаюсь выполнить запрос об отключении SP, я получил ошибку на стороне ADFS:Ошибка обработки SAML LogOutRequest на сервере ADFS

MSIS7000: Запрос на вход не соответствует стандарту WS-Federation для клиентов веб-браузера или профиля WebSSO протокола SAML 2.0.

EDIT Более подробно сообщение от ADFS трассировки событий:

MSIS7015: Этот запрос не содержит ожидаемого сообщения протокола или неправильные параметры протокола были найдены в соответствии с креплениями протокола HTTP SAML.

Я рассмотрел сообщение о выходе SAML и посмотрел правильно. Просто упомянем, что тот же SP выходит из строя с помощью ForgeRocks IdP (ex Sun OpenSSO).

SAML запрос loout сообщение:

<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
       ID="b00b3f55-f3e3-4935-9e91-da6bf8b62efd" 
       Version="2.0" 
       IssueInstant="2013-08-27T09:45:08Z" 
       Destination="https://00.00.00.00/adfs/ls/" 
       Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" 
       NotOnOrAfter="2013-08-27T09:50:08Z" 
       > 
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">SPEntityId/</saml:Issuer>      
<saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">[email protected]</saml:NameID> 
<samlp:SessionIndex>_ea853497-c58a-408a-bc23-c849752d9741</samlp:SessionIndex> 

EDIT

Lan предложил мне, что подписание сообщений запроса выхода из системы обязательно. Он был прав. В спецификации OASIS (http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf), раздел 4.4.3.1. это описано. В соответствии с этим я отправляю подписанные сообщения, но у меня такая же проблема.

Подписано сообщение:

<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
       ID="aed640c0-9455-49ea-9450-4ad7c08d98e7" 
       Version="2.0" 
       IssueInstant="2013-08-29T15:22:45Z" 
       Destination="https://server/adfs/ls/" 
       Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" 
       NotOnOrAfter="2013-08-29T03:27:45Z" 
       > 
<saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
      Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">user</saml:NameID> 
<samlp:SessionIndex>_677952a2-7fb3-4e7a-b439-326366e677db</samlp:SessionIndex> 
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">SPIssuer</saml:Issuer> 
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
     <Reference URI="#aed640c0-9455-49ea-9450-4ad7c08d98e7"> 
      <Transforms> 
       <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
      <DigestValue>53jjPvQ2Ty1Z+VikwrUwW4Erj3k=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>signed value</SignatureValue> 
    <KeyInfo> 
     <X509Data> 
      <X509Certificate>certificate</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
</Signature> 

Что я делаю не так? Должна ли быть указана какая-либо другая конечная точка в ADFS? Как я понял, он должен использоваться так же, как для запросов на подписку (которые отлично работают на моей стороне).

Спасибо, Rastko

ответ

6

Finlay я могу сделать SLO :)

Раньше я работал с IDP ForgeRock и она работала отлично, но с ADFS не сделал. Очевидно, что Microsoft ограничила правила, связанные с форматированием сообщений SAML. Выводы, которые я нашел:

  1. LogoutRequest сообщение должно быть подписано (SAML 2.0 Профили ДОС, раздел 4.4.3.1). Спасибо Яну за это.

  2. Важное значение имеет порядок элементов XML и атрибутов. В нижней части этого сообщения находится окончательная версия моего запроса на выход.

  3. NameId должен быть в том же формате, что и полученный от аутентификации. Он должен содержать элементы, ожидаемые ADFS. Эти ссылки помогли мне: Name Identifier (Name ID) claim in the SAML subject и SAML LogoutRequest

  4. LogoutRequest подпись должна мне трансформировали XmlDsigExcC14NTransform, которые должны быть добавлены после XmlDsigEnvelopedSignatureTransform

  5. метод канонизации для подписания должен быть http://www.w3.org/2001/10/xml-exc-c14n#

  6. Эмитент, NameID и SessionIndex являются обязательные элементы XML

  7. Пространства имен являются обязательными: xmlns: samlp = "urn: oasis: names: tc: SAML: 2.0: protocol" и XMLNS: SAML = "урна: оазис: имена: дц: SAML: 2.0: Утверждающие"

Final LogoutRequest сообщение, что работает:

<samlp:LogoutRequest ID="f8a62847-92f2-4f0c-936a-df9efe0cc42f" 
       Version="2.0" 
       IssueInstant="2013-08-29T20:53:50Z" 
       Destination="https://server/adfs/ls/" 
       Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" 
       xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
       > 
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://sp.com/</saml:Issuer> 
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
     <Reference URI="#f8a62847-92f2-4f0c-936a-df9efe0cc42f"> 
      <Transforms> 
       <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
       <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      </Transforms> 
      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
      <DigestValue>W7F1E2U1OAHRXn/ItbnsYZyXw/8=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue></SignatureValue> 
    <KeyInfo> 
     <X509Data> 
      <X509Certificate></X509Certificate> 
     </X509Data> 
    </KeyInfo> 
</Signature> 
<saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
      Format="http://schemas.xmlsoap.org/claims/UPN" 
      >user</saml:NameID> 
<samlp:SessionIndex>_2537f94b-a150-415e-9a45-3c6fa2b6dd60</samlp:SessionIndex> 

+0

AuthRequest работал для меня с ADFS2.0 без подписания. Но LogoutRequest не работает. Почему эта аномалия? Обязательно ли подписывать LogoutRequest - конечно? – mavis

1

IIRC SAML 2.0 SP инициированное SLO требует использования цифровой подписи на LogoutRequest? Это гарантирует, что никто не обманывает LogoutRequest и не выводит пользователя из всех существующих сеансов.

Предполагая, что вы используете привязку POST, а не Перенаправление, поскольку я не вижу подпись в XML. При перенаправлении информация подписи передается как параметр запроса.

+0

Да, я знаю, что подпись и шифрование являются неотъемлемой частью сообщений SAML. Я использую это в тестовой среде и упрощаю сценарии. Я не использую эти элементы безопасности. Я использую привязку POST. Я удалил подпись на моем RelayParty в конфигурации ADFS. Если это необходимо для подписания, я предполагаю, что также запрос аутентификации будет вызван ошибками, но он работает правильно. – Rastko

+0

Отражая Microsoft.IdentityServer.Protocols.Saml.dll и HttpSamlMessageFactory, которые отвечают за создание SamlMessage, обнаружили, что подписание не является обязательным. Взгляните на следующую часть кода: string value = collection.Get («Подпись»); строка text2 = collection.Get ("SigAlg"); если (! String.IsNullOrEmpty (значение)) { \t если (string.IsNullOrEmpty (text2)) \t { \t \t бросить новый .. \t} \t // некоторый код } возвращение base.CreateFromNameValueCollection (baseUrl, коллекция); – Rastko

+0

Не обязательно подписывать AuthnRequest ... это необязательно, независимо от привязки. Однако в соответствии с спецификацией (SAML 2.0 Profiles doc, раздел 4.4.3.1) при использовании асинхронного связывания (POST или перенаправление) LogoutRequest ДОЛЖЕН быть подписан. Я не эксперт по ADFS, но я был бы удивлен, если бы вы могли намеренно сделать ADFS несоответствующим ... – Ian