2013-08-27 2 views
2

IdP로 ADFS 서버가 있습니다. 별도의 SP 응용 프로그램이 있습니다. 이들은 신뢰의 원으로 정의됩니다. SSO over SAML 프로토콜이 제대로 작동합니다. SP 초기화 된 로그 아웃 요청을 시도하면 ADFS 쪽에서 오류가 발생합니다.ADFS 서버에서 SAML LogOutRequest 처리가 실패했습니다.

MSIS7000 : 로그인 요청이 웹 브라우저 클라이언트 또는 SAML 2.0 프로토콜 WebSSO 프로필의 WS-Federation 언어를 준수하지 않습니다.

편집 ADFS 이벤트 추적에서 더 상세 메세지 :

MSIS7015

: 예상되는 프로토콜 메시지 또는 잘못된 프로토콜 매개 변수를 포함하지 않는이 요청은 HTTP의 SAML 프로토콜 바인딩에 따라 발견되었다.

나는 로그 아웃 SAML 메시지를 검토하고 올바르게 보인다. ForgeRocks IdP (예 : Sun OpenSSO)에서 동일한 SP가 올바르게 로그 아웃했다는 것을 언급하십시오.

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 란 나에게 로그 아웃 요청 메시지의 서명을 제안

는 필수입니다. 그는 옳았다. 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

핀리 나는 :) 이전에 내가 ForgeRock의 IDP 일한

을 SLO를 할 수 있으며, 그것은 완벽하게 작동하지만, ADFS하지 않았다. Microsoft는 SAML 메시지 형식과 관련된 규칙을 제한하고 있음이 분명합니다. 내가 찾은 결론 :

  1. 로그 아웃 요청 메시지는 반드시 서명되어야합니다 (SAML 2.0 프로파일 문서, Sect 4.4.3.1). 이안 고마워.

  2. XML 요소 및 속성의 순서는 중요합니다. 이 메시지 맨 아래에 내 로그 아웃 요청의 최종 버전이 있습니다.

  3. NameId는 AuthenticationResponse에서받은 것과 같은 형식이어야합니다. 여기에는 ADFS에서 요구하는 요소가 포함되어야합니다. Name Identifier (Name ID) claim in the SAML subjectSAML LogoutRequest

  4. LogoutRequest 서명이 나를 XmlDsigExcC14NTransform 형질 전환해야한다

  5. , 즉 XmlDsigEnvelopedSignatureTransform

    이후에 추가해야
  6. 서명에 대한

    시성 방법은 http://www.w3.org/2001/10/xml-exc-c14n#

    발행자, NameID 및 SessionIndex이

    입니다
  7. 해야한다 : 이러한 링크는 나에게 도움이 필수 XML 요소

  8. 네임 스페이스는 필수입니다. xmlns : samlp = "urn : oasis : names : tc : SAML : 2.0 : protocol"및 XMLNS : SAML = "항아리 : 오아시스 : 이름 : TC : SAML : 2.0 : 주장"

최종 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를 스푸핑하지 않고 사용자를 모든 기존 세션에서 로그 아웃시킬 수 있습니다.

XML에서 서명을 볼 수 없어서 POST 바인딩을 사용하고 리디렉션되지 않는다고 가정합니다. 리디렉션을 사용하면 서명 정보가 쿼리 매개 변수로 전달됩니다.

+0

예, 내가 아는 그 서명과 암호화는 SAML 메시지의 필수 부분입니다. 나는 이것을 테스트 환경에서 사용하고 있으며,이 보안 요소를 사용하지 않는 시나리오를 단순화하고있다. POST 바인딩을 사용하고 있습니다. 내 RelayParty에서 ADFS 구성의 서명을 제거했습니다. 서명이 의무적 인 경우 인증 요청도 실패로 끝나 겠지만 제대로 작동하고 있다고 가정합니다. – Rastko

+0

SamlMessage 만들기를 담당하는 Microsoft.IdentityServer.Protocols.Saml.dll 및 HttpSamlMessageFactory를 반영하여 서명은 필수 사항이 아닙니다. 다음 코드 부분을 살펴보십시오. string value = collection.Get ("Signature"); string text2 = collection.Get ("SigAlg"); 경우 (! string.IsNullOrEmpty (값)) { \t 경우 (string.IsNullOrEmpty (텍스트 2)) 새로운 \t { \t \t 던져 .. \t} \t // 일부 코드 } 반환 base.CreateFromNameValueCollection (baseUrl, collection); – Rastko

+0

바인딩에 관계없이 선택 사항 인 AuthnRequest ...에 서명하는 것은 필수 사항이 아닙니다. 그러나 비동기 바인딩 (POST 또는 리디렉션)을 사용할 때 사양 (SAML 2.0 프로파일 문서, Sect 4.4.3.1)에 따라 LogoutRequest에 서명해야합니다. 저는 ADFS 전문가가 아니지만 의도적으로 ADFS를 준수하지 않을 경우 놀랄 것입니다 ... – Ian

관련 문제