SAML 플러그인을 사용해도 속성이 제대로 매핑되지 않습니다

안녕하세요,

저희 Shibboleth를 Discourse 인스턴스에 통합하는 중입니다. 현재는 로그인 자체는 되지만, 잘못된 데이터(이름, 이메일 등…)가 반환되고 있습니다.

SSO에서 넘어오는 데이터의 일부는 다음과 같습니다.

    <saml2:Attribute FriendlyName="givenName" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
      <saml2:AttributeValue>Joao Miguel</saml2:AttributeValue>

에러 로그는 다음과 같습니다:

SAML Debugging: saml_auth: {:uid=>"AAdzZWNyZXQ0uudwQFYHs1n7nrvB/A4t4l6q+6aAXInZRL4XIO+mnEEEq4t8UwBnzJRh50mnTGDsQAPvWThJNaUNR6smCochT1I2oXwvyoU4lQG+5hbVmCvkkmYDPOujrvgNloXWNg==", :info=>{"name"=>nil, "email"=>nil, "first_name"=>nil, "last_name"=>nil, "nickname"=>nil}.......   @attributes={............."urn:oid:2.5.4.42"=>["Joao Miguel"]

FriendlyName이 문제일 것 같습니다. saml_authenticator.rb의 어떤 옵션과도 매칭되지 않기 때문입니다:

statements = “name:name|email:email,mail|first_name:first_name,firstname,firstName|last_name:last_name,lastname,lastName|nickname:screenName”

FriendlyName이 모든 속성에서 동일하게 반복되므로 매핑을 어떻게 해야 할지 모르겠습니다. 이 문제를 해결하는 방법에 대해 아이디어가 있으신 분 계신가요?

감사합니다

이걸 성공적으로 작동하게 하셨나요?

안녕하세요 @Ivan.bacher, @JoreisPy. discourse-saml 설정을 통해 올바른 속성을 매핑하는 데 성공하신 분이 계신가요?

플러그인에서 이 설정을 사용해 보았지만 아직까지 성공하지 못했습니다:

좋은 하루 보내세요! :slight_smile:

SAML 통합을 테스트하는 중에도 동일한 문제에 부딪혔고, 마침내 정상 작동하게 만들었습니다. 로그가 활성화된 상태에서 @attributes의 내용을 확인해 보세요. 매핑에 필요한 실제 키는 바로 이것이며, 친숙한 이름(friendly name)이 아닙니다. 이는 XML 데이터의 Name 속성에 해당합니다. 제 경우 app.yml 안의 매핑은 다음과 같이 변경되었습니다:

DISCOURSE_SAML_REQUEST_ATTRIBUTES: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
DISCOURSE_SAML_ATTRIBUTE_STATEMENTS: "email:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"

설정 변경 후 **재빌드(rebuild)**하는 것도 중요합니다. 이렇게 한 후, SAML 응답에서 이메일 값이 올바르게 매핑되었습니다.

예시를 공유해 주셔서 감사합니다. discourse-saml/config/locales/server.en.yml at main · discourse/discourse-saml · GitHub 파일의 정확한 형식이 무엇을 의미하는지 명확하지 않습니다.

또한, 향후 SAML 플러그인에서는 Discourse 변수에 하나의 속성보다 여러 속성을 매핑할 수 있는 기능이 추가될 예정입니다. 따라서 해당 형식은 기본적으로 다음을 나타냅니다:

‘<Discourse_변수>:<SAML_속성1>,<SAML_속성2>’

아마도 이 글이 적절한 자리는 아닐 수 있지만, 한 가지만 추가하자면, SAML 플러그인을 사용하려면 email, name, first_name, last_name, uid와 같은 Discourse 속성이 필요합니다.

추가로

def attribute_statements
    result = {}
    statements =
      "name:fullName,name|email:email,mail|first_name:first_name,firstname,firstName|last_name:last_name,lastname,lastName|nickname:screenName"
    custom_statements = setting(:attribute_statements)

    statements = "#{statements}|#{custom_statements}" if custom_statements.present?

    statements
      .split("|")
      .map do |statement|
        attrs = statement.split(":", 2)
        next if attrs.count != 2
        (result[attrs[0]] ||= []) << attrs[1].split(",")
        result[attrs[0]].flatten!
      end

    result
  end

이 코드 부분은 (저는 Ruby 프로그래머가 아니라는 점을 유념해 주십시오) 시스템이 작동하려면 모든 속성을 시스템의 속성에 매핑해야 한다는 것을 시사합니다. 이 정보를 테스트해 보겠습니다. (현재 SAML 플러그인 관련 문제가 있어서 문제를 조사하고 있습니다).