Autenticar com SAML fornece nome de usuário e e-mail com hash

Olá,

Gostaria de autenticar os usuários da minha instalação do Discourse com o SAML da nossa universidade.

Estou usando a versão do Discourse via Docker com o plugin SAML. Tentei seguir as instruções no site do GitHub deste plugin.

Tudo funciona bem até que apareça o seguinte formulário:


Em vez do endereço de e-mail regular que eu esperava ver, agora vejo um valor hexadecimal, que presumo ser a forma hash do endereço de e-mail. Não consigo continuar o processo de autenticação com esses valores.

Qualquer ajuda sobre este tópico seria muito apreciada!

Atenciosamente,
Ronald

Olá, Ronald :slight_smile: :wave: estamos muito felizes em ver cada vez mais universidades se juntando à família Discourse :smiley:

Você tem um problema bastante interessante! Minha experiência com SAML/SSO não é muito forte, então não tenho certeza do que está acontecendo aqui, mas você pode tentar ativar a configuração do site verbose sso logging? Isso ajudaria a mostrar alguns erros úteis em /logs e talvez explicar por que você está enfrentando esse problema ou fornecer algo mais específico que você possa compartilhar aqui, para que possamos ajudar melhor.

Minha suposição (e minha experiência com SAML é limitada; acho que só ajudei alguém a configurá-lo uma vez) é que o problema está no lado do SAML. Ou ele está configurado para enviar o hash, ou você está de alguma forma usando o campo errado.

Muito obrigado pela sua rápida resposta!

Após configurar o log do SSO para verbose, foi isso que encontrei no 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)

Substituí o certificado por <SNIP> e meu endereço IP por <IP>.

Obrigado pela resposta rápida!

Isso também pode ser o caso! Entrarei em contato com o emissor SAML e informarei sobre a hash…

Sim! Dá para ver claramente que o SAML está enviando um hash do e-mail e do nome de usuário.

Acho que existe alguma configuração onde você mapeia os campos do SAML para os do Discourse, então é plausível que haja algo que você possa alterar no lado do Discourse para corrigir isso.

Após mais pesquisas, descobri que o código ‘hashed’ no formulário de registro é, na verdade, o NameID enviado pelo IdP. Na configuração do SAML no IdP, também ativei os seguintes atributos:

  • Nome de exibição: urn:mace:dir:attribute-def:displayName
  • Nome completo: urn:mace:dir:attribute-def:cn
  • Endereço de e-mail: urn:mace:dir:attribute-def:mail
  • ID do usuário: urn:mace:dir:attribute-def:uid

Um terceiro confirmou que esses atributos são realmente enviados pelo IdP. No entanto, por algum motivo, os valores desses atributos não são utilizados no formulário de registro do Discourse (como mostrado anteriormente). Eu assumi que, no formulário:

  • O campo E-mail teria o valor de urn:mace:dir:attribute-def:mail;
  • O campo Nome de usuário teria o valor de urn:mace:dir:attribute-def:mail;
  • O campo Nome teria o valor de urn:mace:dir:attribute-def:displayName (preferencialmente) ou urn:mace:dir:attribute-def:cn.

Existe alguma maneira de configurar o Discourse-SAML para mapear esses atributos corretamente?

Olá @ronligt, algum sucesso em mapear os atributos corretos através das configurações do discourse-saml?

Tenho tentado usar esta configuração no plug-in, mas sem sorte até agora:

Tenha um bom dia! :slight_smile: