es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo verificar la respuesta SAML (Assertion) cifrada de ADFS.

Soy un traductor español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Puedo iniciar sesión y recibir SAMLResponse a través de HTTP-Redirect binding y también puedo desencriptar usando la clave privada y obtener las reclamaciones.

Mi pregunta sigue siendo ¿necesitamos verificar la respuesta saml (ADFS)? Si es así, ¿cómo hacerlo?

¿Necesito usar la clave pública del proveedor de identidad (IP)? ¿Estará disponible en IP (Metadata)?

Tengo la respuesta SAML en el siguiente parámetro de solicitud

SAMLResponse = base64(deflate(datos))
signature = valorhash
sigAlg = sha256

¿Cómo validarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es altamente recomendable verificar la respuesta SAML recibida del proveedor de identidad antes de confiar en los datos contenidos en ella. Verificar la respuesta SAML ayuda a asegurar que la respuesta sea auténtica y que no haya sido modificada durante la transmisión.

    Para verificar la respuesta SAML, puede seguir los siguientes pasos:

    1. Obtener la clave pública del proveedor de identidad a partir de sus metadatos. Los metadatos normalmente incluyen la clave pública del IP utilizada para firmar la respuesta SAML.
    2. Verificar la firma de la respuesta utilizando la clave pública obtenida en el paso 1. Para hacer esto, puede usar la biblioteca xmlsec para Python, la cual provee soporte para firmas digitales en XML.

      from xmlsec import vars, md, ds, keys, tree
      
      # Cargar el documento XML de respuesta SAML
      saml_resp = tree.fromstring(base64.b64decode(SAMLResponse))
      
      # Localizar el elemento de firma en la respuesta SAML
      signature_nodes = saml_resp.xpath("//ds:Signature", namespaces=vars)
      signature_node = signature_nodes[0]
      
      # Cargar la clave pública a partir de los metadatos del proveedor de identidad
      metadata = load_metadata_from_url(idp_metadata_url)
      cert_text = metadata['idp_cert']
      cert = keys.DataX509(cert_text, require_explicit_policy=True)
      
      # Crear el contexto para verificar la firma
      signature_ctx = dsig.SigCtx()
      signature_ctx.verify(cert.key, signature_node)
      

      Este código carga la respuesta SAML como un documento XML, localiza el elemento de firma en la respuesta, carga la clave pública del proveedor de identidad a partir de sus metadatos, y verifica la firma utilizando la biblioteca xmlsec.

    3. Una vez que la firma ha sido verificada, puede proceder con la desencriptación de la respuesta SAML y la recuperación de las declaraciones como ya lo ha hecho.

    En resumen, para verificar la respuesta SAML, necesita obtener la clave pública del proveedor de identidad a partir de sus metadatos, y usar esa clave pública para verificar la firma de la respuesta utilizando una biblioteca como xmlsec.

Comments are closed.