SAML 인증 시 해시된 사용자 이름과 이메일이 반환됩니다

안녕하세요,

저희 대학의 SAML을 사용하여 Discourse 설치 환경의 사용자를 인증하고 싶습니다.

SAML 플러그인을 사용한 Discourse의 Docker 버전을 사용하고 있으며, 해당 플러그인의 GitHub 사이트 설명서를 따르도록 시도해 보았습니다.

아래의 양식이 표시될 때까지는 모든 것이 정상적으로 작동합니다:


보통 이메일 주소를 볼 것으로 예상했는데, 이제 이메일 주소의 해시 형태라고 추정되는 16진수 값이 표시됩니다. 이 값으로는 인증 과정을 계속 진행할 수 없습니다.

이 주제에 대한 도움을 주시면 감사하겠습니다!

감사합니다,
Ronald

로날드님 안녕하세요 :slight_smile: :wave: 점점 더 많은 대학이 디스코urs 가족에 합류하는 것을 보니 정말 기쁩니다 :smiley:

흥미로운 문제를 겪고 계시네요! 제 SAML/SSO 관련 지식은 깊지 않아서 정확히 어떤 일이 일어나고 있는지 확신할 수 없지만, verbose sso logging 사이트 설정을 활성화해 보실 수 있을까요? /logs에서 유용한 오류 메시지를 확인할 수 있게 되어, 이 문제가 발생하는 이유를 파악하거나 여기서 공유할 수 있는 더 구체적인 정보를 얻을 수 있을 것 같습니다. 그러면 더 잘 도와드릴 수 있습니다.

제 추측(그리고 SAML에 대한 제 경험은 제한적입니다. 한 번 누군가가 설정하는 것을 도와준 적이 있는 것 같습니다)은 문제가 SAML 쪽에 있다는 것입니다. 해시를 보내도록 설정되어 있거나, 어딘가에서 잘못된 필드를 사용하고 있는 것 같습니다.

빠른 답변에 정말 감사합니다!

SSO 로그를 verbose로 설정한 후 production.log에서 발견한 내용은 다음과 같습니다:

Started GET "/session/csrf" for <IP> at 2020-07-24 14:32:51 +0000
Processing by SessionController#csrf as JSON
Completed 200 OK in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 321)
Started POST "/auth/saml" for <IP> at 2020-07-24 14:32:51 +0000
(saml) Request phase initiated.
Started POST "/auth/saml/callback" for <IP> at 2020-07-24 14:33:23 +0000
(saml) Callback phase initiated.
Processing by Users::OmniauthCallbacksController#complete as HTML
  Parameters: {"SAMLResponse"=>"<SNIP>", "provider"=>"saml"}
Redirected to https://discourse-imphys.tudelft.nl/
Completed 302 Found in 24ms (ActiveRecord: 0.0ms | Allocations: 10562)
Started GET "/" for <IP> at 2020-07-24 14:33:24 +0000
Processing by ListController#latest as HTML
  Rendering list/list.erb within layouts/application
  Rendered list/list.erb within layouts/application (Duration: 3.8ms | Allocations: 1991)
  Rendered layouts/_head.html.erb (Duration: 1.9ms | Allocations: 911)
  Rendered common/_discourse_stylesheet.html.erb (Duration: 0.4ms | Allocations: 267)
  Rendered application/_header.html.erb (Duration: 2.2ms | Allocations: 1022)
Completed 200 OK in 34ms (Views: 13.1ms | ActiveRecord: 0.0ms | Allocations: 15963)
Started GET "/u/hp.json" for <IP> at 2020-07-24 14:33:24 +0000
Processing by UsersController#get_honeypot_value as JSON
Completed 200 OK in 2ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 812)
Started GET "/u/check_username?username=&email=94422472fbfb32fdd22eaa2f88c723fb44be9958" for <IP> at 2020-07-24 14:33:25 +0000
Processing by UsersController#check_username as JSON
  Parameters: {"username"=>"", "email"=>"94422472fbfb32fdd22eaa2f88c723fb44be9958"}
Completed 200 OK in 1ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 316)
Started GET "/u/check_username?username=94422472fbfb32fdd22e&email=94422472fbfb32fdd22eaa2f88c723fb44be9958" for <IP> at 2020-07-24 14:33:25 +0000
Processing by UsersController#check_username as JSON
  Parameters: {"username"=>"94422472fbfb32fdd22e", "email"=>"94422472fbfb32fdd22eaa2f88c723fb44be9958"}
Completed 200 OK in 3ms (Views: 0.2ms | ActiveRecord: 0.0ms | Allocations: 1421)

인증서를 <SNIP>로, IP 주소를 <IP>로 대체했습니다.

빠른 답변 감사합니다!

그렇기도 하네요! SAML 발급자에게 연락해서 해싱에 대해 알려드릴게요…

네! SAML이 이메일과 사용자 이름의 해시를 보내고 있는 것을 명확히 볼 수 있습니다.

SAML 필드를 Discourse 필드에 매핑하는 설정이 있을 것 같아서, Discourse 측에서 수정할 수 있는 부분이 있을 수 있다고 생각합니다.

더욱 조사해 본 결과, 가입 양식의 ‘hashed’ 코드는 실제로 IdP가 전송한 NameID임을 알게 되었습니다. IdP의 SAML 설정에서도 다음 속성들을 활성화했습니다:

  • Display Name: urn:mace:dir:attribute-def:displayName
  • Full Name: urn:mace:dir:attribute-def:cn
  • Email address: urn:mace:dir:attribute-def:mail
  • User ID: urn:mace:dir:attribute-def:uid

제3자의 확인을 통해 이러한 속성들이 실제로 IdP에서 전송되고 있음이 확인되었습니다. 하지만 어떤 이유에서인지 Discourse의 가입 양식(이전에 보여드린 바와 같이)에서 이러한 속성의 값들이 사용되지 않고 있습니다. 저는 양식에서 다음과 같이 매핑되기를 기대했습니다:

  • Email은 urn:mace:dir:attribute-def:mail의 값을,
  • Username은 urn:mace:dir:attribute-def:mail의 값을,
  • Name은 urn:mace:dir:attribute-def:displayName(권장) 또는 urn:mace:dir:attribute-def:cn의 값을 가질 것이라고 예상했습니다.

Discourse-SAML을 설정하여 이러한 속성을 올바르게 매핑할 수 있는 방법이 있을까요?

@ronligt님, discourse-saml 설정을 통해 올바른 속성을 매핑하는 데 성공하셨나요?

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

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