이 주제에서는 ADFS(Active Directory Federation Services)를 IdP(ID 제공자)로 사용하여 Blackboard Learn 인스턴스에서 SAML 인증을 설정하는 방법에 관한 지침을 제공합니다. Blackboard Learn 환경은 SP(서비스 제공자) 역할을 합니다. 이러한 단계에서는 Windows Server 2012 R2에서 ADFS 버전 3.0을 사용하지만, 해당 단계는 ADFS 2.0에도 적용될 수 있습니다.

Learn 서비스 제공자

  1. Blackboard Learn에 관리자로 로그인하고 시스템 관리자 > 인증으로 이동합니다.
  2. 제공자 생성 > SAML을 선택합니다.
  3. 다음 설정을 입력합니다.
    • '이름'을 선택하고 ADFS SAML 또는 원하는 항목을 입력합니다.
    • '인증 제공자'를 선택한 다음 이를 비활성으로 설정합니다.
    • 사용자 조회 방법 > 사용자명
    • 호스트명으로 제한 > 모든 호스트명에 이 제공자 사용
    • '링크 텍스트'를 선택하고 ADFS 로그인 또는 원하는 항목을 입력합니다.
  4. 저장 및 구성을 선택합니다.
  5. 엔터티 ID 필드에서 이 값이 ACS URL과 같은지 확인합니다.
  6. 서비스 제공자 메타데이터 아래에서 생성을 선택하고 파일을 데스크톱에 저장합니다.
  7. SAML이라는 이 제공자에 대해 새로운 데이터 소스를 생성하는 것이 좋습니다. 그렇게 하지 않을 경우 SYSTEM 또는 선택하는 항목을 사용하십시오.
  8. 알 수 없는 사용자가 이 SAML 인증 제공자를 통해 로그인하려고 시도할 때 시스템에서 자동으로 계정을 생성하도록 허용하려면 JIT 프로비저닝 활성화 확인란을 선택합니다. 이 확인란을 선택하지 않으면 먼저 Blackboard Learn에서 사용자 계정을 수동으로 생성해야 합니다.
  9. 호환되는 데이터 소스 목록에서 이 인증 제공자와 호환되어야 하는 데이터 소스를 선택합니다.
  10. ID 제공자 유형에 대해 포인트 ID 제공자를 선택합니다.
  11. ID 제공자 메타데이터의 경우 SAML 2.0과 호환되지 않는 요소가 ADFS용 메타데이터 XML 파일에 포함되어 있습니다. 메타데이터를 업로드하기 전에 메타데이터를 수정하여 호환되지 않는 요소를 제거해야 합니다.
    1. ADFS 페더레이션의 기본 메타데이터 위치는 https://[ADFS server hostname]/FederationMetadata/2007-06/FederationMetadata.xml입니다.
    2. 파일을 다운로드하고 텍스트 편집기에서 엽니다. <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"&gt; ... </X509Data></KeyInfo>로 시작하고 </ds:Signature>로 끝나는 섹션을 주의하여 삭제합니다.

      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
       <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
        <ds:Reference URI="#_43879f32-9a91-4862-bc87-e98b85b51158">
         <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
         </ds:Transforms>
         <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
         <ds:DigestValue>z1H1[SNIP]jaYM=</ds:DigestValue>
        </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue&gt; FVj[SNIP]edrfNKWvsvk5A==
        </ds:SignatureValue>
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
         <X509Data>
          <X509Certificate>
          FDdd[SNIP]qTNKdk5F/vf1AocDaX
          </X509Certificate>
         </X509Data>
        </KeyInfo>
      </ds:Signature>

    3. Blackboard Learn에서 업데이트된 메타데이터 XML 파일을 업로드합니다.
  12. SAML 속성 매핑 섹션의 경우 원격 사용자 ID에 SamAccountName을 사용합니다.
  13. 제출을 선택합니다.

ADFS ID 제공자

  1. ADFS 서버에서 ADFS 관리 콘솔에 접근합니다.
  2. 트러스트 관계 > 신뢰 당사자 트러스트 > 신뢰 당사자 트러스트 추가로 이동합니다.
  3. 신뢰 당사자 트러스트 추가 마법사 페이지에서 시작을 선택합니다.
  4. 파일에서 신뢰 당사자에 대한 데이터 가져오기를 선택합니다.
  5. 찾아보기를 선택하고 Learn SP 섹션의 6단계에서 생성한 파일을 업로드합니다. 다음을 선택합니다.
  6. yourlearnserver.blackboard.com과 같은 표시 이름을 입력하고 다음을 선택합니다.
  7. 다단계 인증 설정을 구성하고 싶지 않습니다.를 선택하고 다음을 선택합니다.
  8. 모든 사용자가 이 신뢰 당사자에 접근할 수 있도록 허용을 선택하고 다음을 선택합니다.
  9. 트러스트 추가 준비 완료 단계에서 다음을 선택한 후 종료 단계에서 닫기를 선택합니다.
  10. 마지막 확인란이 선택된 상태로 남아 있으면 신뢰 당사자 트러스트를 생성한 후 클레임 규칙 수정이 열려야 합니다. 그렇지 않을 경우 신뢰 당사자 트러스트를 마우스 오른쪽 버튼으로 클릭하고 클레임 수정을 선택합니다.

신뢰 당사자 트러스트에 대한 클레임 규칙 추가

특성을 클레임으로 전송

신뢰 당사자 트러스트에 대한 클레임 규칙을 추가하면 LDAP 특성이 ADFS 서버에서 Blackboard Learn에 클레임으로 전송됩니다. ADFS 관리 콘솔에서 '신뢰 당사자 트러스트'를 마우스 오른쪽 버튼으로 클릭합니다.

사용자명 전송

  1. 발급 변환 규칙 탭에서 규칙 추가를 선택합니다.
  2. 규칙 템플릿 선택 페이지에서 LDAP 특성을 클레임으로 전송클레임 규칙 템플릿으로 선택한 후 다음을 선택합니다.
  3. 규칙 구성 페이지의 클레임 규칙 이름 상자에 사용자명을 NameID로 변환을 입력합니다.
  4. 속성 저장소 드롭다운에서 Active Directory를 선택합니다.
  5. 왼쪽의 매핑 상자에서 SAM-Account-Name 또는 회사를 선택합니다.
  6. 오른쪽의 매핑 상자에 SamAccountName을 입력하고 완료를 선택합니다.

이름 및 성 전송(선택 사항)

Blackboard Learn의 SAML 인증 설정 페이지에서 JIT 프로비저닝 옵션이 선택되어 있으면 사용자 계정이 없는 경우 Blackboard Learn에서 사용자 계정이 생성되고 이름 LDAP 특성도 이에 따라 매핑되어 ADFS에서 Blackboard Learn으로 전송될 수 있습니다.

  1. 발급 변환 규칙 탭에서 규칙 추가를 선택합니다.
  2. 규칙 템플릿 선택 페이지에서 LDAP 특성을 클레임으로 전송클레임 규칙 템플릿으로 선택한 후 다음을 선택합니다.
  3. 규칙 구성 페이지의 클레임 규칙 이름 상자이름 전송을 입력합니다.
  4. 특성 저장소 드롭다운에서 Active Directory를 선택합니다.
  5. 왼쪽의 매핑 상자에서 Given-Name을 선택합니다.
  6. 오른쪽의 매핑 상자에 urn:oid:2.5.4.42를 입력하고 종료를 선택합니다.
  7. 발급 변환 규칙 탭에서 규칙 추가를 선택합니다.
  8. 규칙 템플릿 선택 페이지에서 LDAP 특성을 클레임으로 전송클레임 규칙 템플릿으로 선택한 후 다음을 선택합니다.
  9. 규칙 구성 페이지의 '클레임 규칙 이름' 상자에 성 전송을 입력합니다.
  10. 특성 저장소 드롭다운에서 Active Directory를 선택합니다.
  11. 왼쪽의 매핑 상자에서 Surname을 선택합니다.
  12. 오른쪽의 매핑 상자에 urn:oid:2.5.4.4를 입력하고 종료를 선택합니다.

수신 클레임 변환

  1. 규칙 추가를 선택합니다.
  2. 규칙 템플릿 선택 페이지에서 클레임 규칙 템플릿에 대해 수신 클레임 변환을 선택한 후 다음을 선택합니다.
  3. 규칙 구성 페이지의 클레임 규칙 이름 상자에 이메일을 이름 ID로 변환을 입력합니다.
  4. 수신 클레임 유형SamAccountName이어야 합니다. 이 유형은 이전 규칙에서 생성한 발신 클레임 유형과 일치해야 합니다.
  5. 발신 클레임 유형이름 ID입니다.
  6. 발신 이름 ID 형식지정되지 않음입니다.
  7. 모든 클레임 값을 통해 전달이 선택되었는지 확인하고 종료를 선택합니다.
  8. 확인을 선택하여 규칙을 저장하고, 다시 확인을 선택하여 특성 매핑을 완료합니다.

특성 문의 예

신뢰 당사자 트러스트에 대해 이전에 언급한 모든 클레임 규칙을 추가하면 규칙이 발급 변환 규칙 탭에 나타납니다.

다음과 유사한 SubjectAttributeStatement 요소가 사용자가 인증을 받은 후에 SAML POST에 포함된 상태로 ADFS에서 Blackboard Learn으로 전송됩니다.

<Subject>
    <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified ">luke.skywalker</NameID>
    [SNIP]
</Subject>
 
<AttributeStatement>
    <Attribute Name="SamAccountName">
        <AttributeValue>luke.skywalker</AttributeValue>
    </Attribute>
    <Attribute Name="urn:oid:2.5.4.42">
        <AttributeValue>Luke</AttributeValue>
    </Attribute>
    <Attribute Name="urn:oid:2.5.4.4">
        <AttributeValue>Skywalker</AttributeValue>
    </Attribute>
</AttributeStatement>

IdP의 특성이 SAML 응답에서 암호화되지 않은 경우 Firefox 브라우저의 SAML 추적 프로그램 애드온 또는 Chrome SAML Message Decoder를 사용하여 인증 프로세스가 진행되는 동안 IdP에서 릴리즈되어 Blackboard Learn으로 전송 중인 특성을 확인할 수 있습니다.


SHA-1을 사용하도록 ADFS 구성

  1. '관리자 패널'로 이동합니다.
  2. 빌딩 블록에서 빌딩 블록을 선택합니다.
  3. 설치된 도구를 선택합니다.
  4. 목록에서 인증 제공자 - SAML을 찾습니다. 메뉴를 열고 설정을 선택합니다.
  5. 서명 알고리즘 설정 아래의 목록에서 SHA-1을 선택합니다. 서명 알고리즘 유형을 선택한 후 SAML 빌딩 블록을 다시 시작하여 새 설정을 적용합니다.
  6. 변경사항을 저장하려면 제출을 선택합니다.

중요한 추가 ADFS 구성

기본적으로 ADFS는 AES-256을 사용하여 전송하는 특성을 암호화합니다. Blackboard Learn에서 사용한 Java 런타임은 AES-256을 바로 지원하지 않습니다. 사용자는 SAML 인증을 통해 로그인할 수 없으며 다음과 같은 SAML 관련 오류 메시지가 로그에서 발생합니다.

/usr/local/blackboard/logs/bb-services-log.txt의 경우:

2016-10-26 13:16:51 -0400 - unsuccessfulAuthentication - org.springframework.security.authentication.AuthenticationServiceException: Error validating SAML message
        at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:100)
        at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:167)
        at org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:87)
        at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:184)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
 [SNIP]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.opensaml.common.SAMLException: Response doesn't have any valid assertion which would pass subject validation
        at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:229)
        at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:87)
        ... 229 more

/usr/local/blackboard/logs/tomcat/catalina-log.txt의 경우:

ERROR 2016-10-26 13:16:51,519 connector-38: userId={unset id}, sessionId=85DC3851365512EE96AABFBB8E5A519C org.opensaml.xml.encryption.Decrypter - Error decrypting the encrypted data element
org.apache.xml.security.encryption.XMLEncryptionException: Illegal key size
Original Exception was java.security.InvalidKeyException: Illegal key size
    at org.apache.xml.security.encryption.XMLCipher.decryptToByteArray(XMLCipher.java:1822)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:596)
    at org.opensaml.xml.encryption.Decrypter.decryptUsingResolvedEncryptedKey(Decrypter.java:795)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToDOM(Decrypter.java:535)
    at org.opensaml.xml.encryption.Decrypter.decryptDataToList(Decrypter.java:453)
    at org.opensaml.xml.encryption.Decrypter.decryptData(Decrypter.java:414)
    at org.opensaml.saml2.encryption.Decrypter.decryptData(Decrypter.java:141)
    at org.opensaml.saml2.encryption.Decrypter.decrypt(Decrypter.java:69)
    at org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:199)
    at org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:87)
    [SNIP]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
    at javax.crypto.Cipher.init(Cipher.java:1393)
    at javax.crypto.Cipher.init(Cipher.java:1327)
    at org.apache.xml.security.encryption.XMLCipher.decryptToByteArray(XMLCipher.java:1820)
    ... 238 more

Blackboard Learn SaaS 백엔드 구성은 일반적으로 지원되지 않으므로 보편적인 해결 옵션은 ADFS 서버에서 PowerShell을 열고 Blackboard Learn에 대해 생성된 신뢰 당사자가 암호화되지 않은 상태로 특성을 전송하도록 설정하는 것입니다. 전체 통신이 SSL을 통과하므로 이로 인해 인증 보안의 수준이 감소하지 않습니다. 또한 디버깅 도구를 사용하여 특성을 확인할 수 있으며 Blackboard Learn 시스템을 다시 시작할 필요가 없으므로 모든 문제를 쉽게 디버깅할 수 있습니다.

Blackboard Learn에 대해 생성된 신뢰 당사자가 암호화되지 않은 상태로 특성을 전송하도록 설정하려면 PowerShell을 열고 다음 명령을 실행하여 TargetName을 이전에 생성된 신뢰 당사자의 이름으로 바꾸십시오.

set-ADFSRelyingPartyTrust –TargetName "yourlearnsever.blackboard.com" –EncryptClaims $False

이렇게 변경한 후에 ADFS 서비스를 다음 명령으로 다시 시작해야 합니다. Restart-Service ADFSSRV


SAML 인증 제공자를 활성 상태로 설정

  1. Blackboard Learn에서 시스템 관리자 > 인증으로 이동합니다.
  2. SAML 인증 제공자의 이름 옆에 있는 메뉴를 열고 활성으로 설정합니다.

그러면 ADFS IdP가 SAML 인증 제공자로 구성되어 Blackboard Learn에서 로그인하는 데 사용될 수 있습니다.

  1. Blackboard Learn 로그인 페이지에서 타사 계정으로 로그인을 선택합니다.
  2. SAML 인증 제공자를 선택합니다.
  3. ADFS 로그인 페이지에서 로그인 자격 증명을 입력합니다.

IdP 로그인 페이지로 자동으로 리디렉션됩니다.

표준 Blackboard Learn 로그인 페이지에는 기본 Blackboard Learn 내부 인증 제공자에 대한 사용자명/비밀번호 필드와 SAML에 대한 작은 다음을 사용하여 로그인... 링크가 표시되므로 교육기관에서는 SAML 인증을 활성화하는 경우 사용자가 Blackboard Learn 사이트로 처음 이동할 때 해당 IdP 인증 서버로 자동으로 리디렉션되도록 요청할 수 있습니다.

Blackboard Learn GUI에서 이 작업을 완료하는 한 가지 방법은 시스템 관리자 > 인증으로 이동하고 기본 Blackboard Learn 내부 인증을 비활성으로 설정하는 것입니다. 이렇게 하면 로그인 페이지가 더 이상 표시되지 않으며 사용자가 SAML 로그인으로 즉시 리디렉션됩니다. 이 방법의 문제는 기본 로그인 URL이 덮어씌워지고 비 SAML 사용자는 모두 로그인할 수 없게 된다는 점입니다.

이 문제를 방지하고 거의 동일한 결과를 제공하려면 '사용자 지정 로그인' 페이지를 사용하십시오. 그러면 사용자가 SAML 인증 제공자의 IdP 로그인 페이지로 리디렉션되지만 기본 로그인 링크도 사용할 수 있습니다.

사용자가 SAML 인증 공급자의 IdP 로그인 페이지로 리디렉션되도록 '사용자 지정 로그인 페이지'를 생성할 수 있습니다. 기본 로그인 링크는 계속 필요에 따라 사용할 수 있습니다.

  1. 기본 Blackboard Learn 내부 인증이 활성 상태인지 확인합니다.
  2. 기본 로그인 페이지로 이동하여 제공자 리디렉션의 위치(예: 다음을 사용하여 로그인... - SAML)를 복사합니다(링크를 열지 않고 링크 위치 복사 사용).
  3. Blackboard Learn GUI에서 시스템 관리자 > 커뮤니티: 브랜드 및 테마 > 로그인 페이지 사용자 지정으로 이동합니다.
  4. 기본 로그인 페이지 텍스트 옆에 있는 다운로드를 선택하여 기본 로그인 JSP 파일을 다운로드합니다.
  5. 다운로드한 로그인 JSP 파일을 텍스트 편집기로 엽니다.
  6. URL 텍스트를 2단계에서 복사한 URL(https://URL_Goes_Here를 표시하는 두 개의 위치에서)로 대체하면서 다음 샘플 HTML을 로그인 JSP 파일에 추가합니다.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title>Blackboard Learn - Redirect</title>
    <meta http-equiv="REFRESH" content="0;url=https://URL_Goes_Here"></HEAD>
    <BODY style="font-family: arial,sans-serif;font-size: small; color: grey; padding: 1em; ">
    Redirecting... <a style="color:grey" href="https://URL_Goes_Here">Go to login page</a&gt; if you are not automatically redirected.
    </BODY>
    </HTML>

  7. Blackboard Learn GUI의 로그인 페이지 사용자 지정으로 다시 돌아가 사용자 지정 로그인 사용 페이지를 선택한 다음 업데이트한 로그인 JSP 파일을 업로드합니다.
  8. 변경을 수행한 후에 로그인 페이지 사용자 지정에서 미리 보기를 선택하여 리디렉션이 제대로 작동하는지 확인합니다.

기본 URL로 이동 중인 사용자는 이제 SAML 인증 제공자를 위한 로그인 페이지로 리디렉션됩니다. 또한 관리자는 계속 다음의 기본 로그인 페이지를 통해 Blackboard Learn 내부 인증을 사용하여 로그인할 수 있습니다. /webapps/login/?action=default_login(즉 /webapps/login/login.jsp).

Original 환경에서 로그인 페이지를 사용자 지정하는 방법 자세히 알아보기

Ultra 환경에서 로그인 페이지를 사용자 지정하는 방법 자세히 알아보기