No obtengo un mapeo correcto de atributos usando el plugin SAML

Hola,

Estoy intentando integrar nuestro Shibboleth con nuestra instancia de Discourse. Por ahora, el inicio de sesión funciona, pero estoy obteniendo los datos incorrectos (nombre, correo electrónico, etc.).

Aquí hay parte de los datos que provienen del 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>

Aquí está el registro de error:

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"]

Diría que el problema tiene que ver con el FriendlyName, ya que no coincide con ninguna de las opciones en saml_authenticator.rb:

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

Dado que el nombre amigable se repite para cada atributo, no estoy seguro de cómo realizar el mapeo. ¿Alguien tiene alguna idea de cómo abordar esto?

Gracias

¿Lograste que esto funcionara?

Hola @Ivan.bacher y @JoreisPy, ¿han tenido éxito en mapear los atributos correctos a través de las configuraciones de discourse-saml?

He estado intentando usar esta configuración en el plugin pero no he tenido suerte hasta ahora:

¡Que tengan un buen día! :slight_smile:

Me encontré con el mismo problema al probar la integración SAML y finalmente logré que funcionara. Con los registros habilitados, verifica el contenido de @attributes, esas son las claves reales que necesitas para el mapeo y no el nombre amigable. Corresponden al atributo Name de los datos XML. En mi caso, el mapeo dentro de app.yml quedó así:

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"

También es importante recompilar después de realizar cambios en la configuración. Después de hacerlo, mapeó correctamente el valor del correo electrónico de mi respuesta SAML.

Gracias por compartir el ejemplo, desde discourse-saml/config/locales/server.en.yml at main · discourse/discourse-saml · GitHub no está claro qué significa el formato exacto.
Además, para futuros plugins SAML, existe la posibilidad de mapear más de un atributo a una variable de Discourse, por lo que el formato básicamente dice:

‘<variable_de_Discourse>:<atributo_SAML1>,<atributo_SAML2>’

Probablemente no sea el lugar adecuado, pero solo para añadir, necesitarás email, name, first_name, last_name y uid como atributos de Discourse para poder usar el plugin SAML.

Adicionalmente

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

esta parte del código (ten en cuenta que no soy programador de Ruby) sugiere que necesitas mapear todos los atributos a tus atributos para que el sistema pueda funcionar… Intentaré probar esa información (tengo un problema en este momento con el plugin SAML y estoy intentando investigar los problemas).