none
Conexión LDAP con certificado de cliente RRS feed

  • Pregunta

  • Hola, buenos días.

    Estoy desarrollando una aplicación Winforms en C#, FrameWork 4.6. Para acceder a la aplicación los usuarios se tienen que validar contra un servidor LDAP. En la máquina cliente tiene que existir un certificado CA (fichero extensión .der).

    Si conecto con el servidor en el puerto 389 la validación de usuario se realiza correctamente, pero cuando lo intento en el puerto 636 siempre obtengo el mismo error.

    ErrorCode: 81
    HResult: -2146233088
    Message: "El servidor LDAP no está disponible."


    El código que utilizo es el siguiente:

    bool ssl = true;
    
    try
    
                {
    
                    if (ssl)
                    {
                        puerto = 636;
                    }
                    else
                    {
                        puerto = 389;
                    }
    
                    // Configure server and port. LDAP w/ SSL, aka LDAPS, uses port 636.
                    // If you don't have SSL, don't give it the SSL port. 
                    LdapDirectoryIdentifier identifier = new LdapDirectoryIdentifier("metadir", 636);
    
                    NetworkCredential creds = new NetworkCredential("usuario", "password");
    
                    // Actually create the connection
                    using (LdapConnection connection = new LdapConnection(identifier, creds, AuthType.Basic))
                    {
                        TimeSpan _timeSpan = new TimeSpan(0, 0, 30);
                        connection.Timeout = _timeSpan;
                        connection.SessionOptions.ProtocolVersion = 3;
                        connection.SessionOptions.SecureSocketLayer = ssl;
                        if (ssl)
                        {
                            X509Certificate2 clientCertificateFile = new X509Certificate2();
                            clientCertificateFile.Import(@"D:\RootCert-NouMetadir.der");
                            connection.ClientCertificates.Add(clientCertificateFile);
                        }
    
                        connection.Bind();
                        MessageBox.Show("OK");
                    }
                }
                catch (LdapException lexc)
                {
                    //String error = lexc.ServerErrorMessage;
                    MessageBox.Show(lexc.Message);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.GetType().ToString() + ": " + ex.Message);
                }
    Mi impresión es de que el certificado de cliente  o no llega al servidor o no es valido. ¿Alguna idea?

    Utilizo Windows 10 y Visual Studio 2019, tengo instalada la aplicación LDAPSoft Ldap Browser 6.10 y desde ella y con el  mismo certificado si que puedo validarme en el servidor.

    Gracias de antemano.

    Un saludo.


    viernes, 6 de diciembre de 2019 14:42

Respuestas

  • Hola   

    Gsus68

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te comparto a continuación el siguiente enlace

     

     https://docs.microsoft.com/es-es/dotnet/api/system.directoryservices.protocols.ldapconnection?view=netframework-4.8

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

     

    • Marcado como respuesta Gsus68 jueves, 12 de diciembre de 2019 18:42
    miércoles, 11 de diciembre de 2019 17:30
    Moderador

Todas las respuestas

  • Hola   

    Gsus68

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te comparto a continuación el siguiente enlace

     

     https://docs.microsoft.com/es-es/dotnet/api/system.directoryservices.protocols.ldapconnection?view=netframework-4.8

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

     

    • Marcado como respuesta Gsus68 jueves, 12 de diciembre de 2019 18:42
    miércoles, 11 de diciembre de 2019 17:30
    Moderador
  • Gracias Pablo, la referencia me ayudo a solucionar mi problema. El siguiente código es el que funciona para mi.

    using (LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier(server)))
                    {
                        TimeSpan _timeSpan = new TimeSpan(0, 0, 30);
                        con.Timeout = _timeSpan;
                        con.SessionOptions.ProtocolVersion = 3;
                        con.SessionOptions.SecureSocketLayer = true;
                        con.Credential = new NetworkCredential(username, contraseña);
                        con.AuthType = AuthType.Basic;
                        var bytes = System.IO.File.ReadAllBytes(@"D:\RootCert.der");
                        X509Certificate2 clientCertificateFile = new X509Certificate2(bytes);
                        con.ClientCertificates.Add(clientCertificateFile);
                        con.SessionOptions.VerifyServerCertificate += (conn, cert) => { return true; };
                        using (con)
                        {
                            con.Bind();
                        }
                    }


    jueves, 12 de diciembre de 2019 18:45