c# .net ldap novell

Novell LDAP C#- Novell.Directory.Ldap-¿Alguien ha hecho que funcione?



.net (6)

91 es "no se puede conectar". Intente colocar el servidor en el formato "ldap: // xxxx", compruebe que userDN esté configurado correctamente (con dominio, etc.).

A menudo uso WireShark para ver qué sucede a nivel de la red (conoce el protocolo LDAP).

Estoy intentando usar la biblioteca publicada por Novell (Novell.Directory.Ldap). Versión 2.1.10.

Lo que he hecho hasta ahora

  • Probé la conexión con una aplicación ( LdapBrowser ) y está funcionando, por lo que no es un problema de comunicación.

  • Está compilado en Mono, pero estoy trabajando con Visual Studio. Entonces creó un proyecto con las fuentes. También incluí una referencia a Mono.Security, porque el proyecto dependía de ello.

  • Comenté una llamada (freeWriteSemaphore (semId);) en la parte de error de captura de la conexión, porque arrojaba más excepciones. Comprobé qué hizo esa llamada, y es solo un mecanismo de rastreo de errores.

  • Seguí los pasos básicos proporcionados en la documentación de Novell ( http://www.novell.com/coolsolutions/feature/11204.html ).

    // Creando una instancia de LdapConnection

    LdapConnection ldapConn = new LdapConnection (); ldapConn.SecureSocketLayer = ldapPort == 636;

    // La función de conexión creará una conexión de socket al servidor

    ldapConn.Connect (ldapHost, ldapPort);

    // La función Bind vinculará las credenciales del objeto de usuario al Servidor

    ldapConn.Bind (userDN, userPasswd);

  • En este momento se está bloqueando en la función Bind (). Me sale el error 91.

Entonces, ¿alguien alguna vez usó esta biblioteca y la vio funcionar? Si es así, ¿qué hiciste para que funcione? ¿Se necesita alguna configuración especial? ¿Hay alguna manera de hacerlo funcionar en el entorno .NET sin Mono (puedo tener referencias a dlls de Mono, pero no quiero que esté instalado en el servidor)?

(ACTUALIZACIÓN) La conexión está en el puerto 636, usando SSL. Comprobé con WireShark la comunicación y la comparé con lo que obtengo del navegador LDAP. He visto que el paso donde se comunica el certificado SSL no lo realiza la biblioteca LDAP. Entonces, ¿cuál es la mejor manera de hacer que haga lo que se supone que debe hacer?

(ACTUALIZACIÓN) Revisé la documentación y está indicando que no es compatible con SSL. http://www.novell.com/coolsolutions/feature/11204.html

Autenticarse al servidor LDAP con LdapConnection.Bind (). Solo admitimos la autenticación de texto claro. El soporte SSL / TLS aún no se ha agregado.

Pero la documentación data de 2004, y desde entonces, se han realizado muchas actualizaciones. Y hay un parámetro en la biblioteca para definir si la conexión usa SSL. Así que ahora estoy confundido.

(ACTUALIZACIÓN) Se encontró una documentación más actualizada: http://developer.novell.com/documentation//ldapcsharp/index.html?page=/documentation//ldapcsharp/cnet/data/bqwa5p0.html . La forma en que se realiza la conexión SSL es registrando el certificado en el servidor. El problema es que lo que estoy haciendo no está vinculado a un servidor Novell específico, por lo que el certificado debe obtenerse dinámicamente.


Creo que ya le he ofrecido esta respuesta a otra persona en otra pregunta.

[Otra pregunta sobre LDAP] [1]

Creo que hay dos cuestiones: 1) ¿Qué clase de vínculo estás tratando de hacer? SSL? ¿Borrar texto? ¿Anónimo?

2) ¿Cómo se configura en el lado de eDirectory para los enlaces LDAP?

La herramienta LDAP Browser, ¿te refieres a la de este enlace? Navegador LDAP gratuito

En el lado de eDirectory, pueden requerir TLS para todas las comunicaciones LDAP, y pueden rechazar enlaces anónimos.

¿Puede pedirle a la gente del otro lado que habilite el rastreo de LDAP? (Uso de DStrace con la opción + LDAP habilitada, algunos enlaces sobre cómo usar Dstrace en Novell eDirectory): Diferentes tipos de captura de Dstrace y comprender DS Trace para Identity Manager.)

Eso generalmente mostrará un mensaje de error que te iluminará.

Supongo que Require TLS está habilitado y es posible que no estés haciendo un enlace SSL exitoso.

Si es así, intente conectarse en el puerto 636, con SSL habilitado, y un DN completamente calificado para el usuario con el que está intentando iniciar sesión.

Si está intentando con SSL habilitado y no está recibiendo un cuadro emergente sobre la aceptación del certificado raíz de confianza de la CA del árbol, entonces tal vez la CA o el certificado SSL que el servidor eDirectory es usuario ha caducado o está roto. (Hay varias causas para esto que pueden ser comunes, y solo toma un momento para solucionarlo).

Por lo general, en Dstrace verá un error sobre el certificado SSL si hay un problema. En este artículo se incluye un ejemplo de la perspectiva de Novell Identity Manager de un certificado caducado: Certificado caducado, así como algunos detalles sobre cómo corregir los certificados.

La siguiente posibilidad es que el DN que está especificando no sea del todo correcto.

Dejame saber si necesitas mas ayuda.


Vine buscando una solución a un problema similar. Mi comando de enlace también fallaría al usar el mismo código en el sitio web de Novell. La solución que funcionó para mí fue agregar una llamada de validación de certificado dinámica. Puedes leer sobre esto aquí .

// Creating an LdapConnection instance LdapConnection ldapConn = new LdapConnection(); ldapConn.SecureSocketLayer = true; ldapConn.UserDefinedServerCertValidationDelegate += new CertificateValidationCallback(MySSLHandler); //Connect function will create a socket connection to the server ldapConn.Connect(ldapHost, ldapPort); //Bind function will Bind the user object Credentials to the Server ldapConn.Bind(userDN, userPasswd); // Searches in the Marketing container and return all child entries just below this //container i.e. Single level search LdapSearchResults lsc = ldapConn.Search("ou=users,o=uga", LdapConnection.SCOPE_SUB, "objectClass=*", null, false); while (lsc.hasMore()) { LdapEntry nextEntry = null; try { nextEntry = lsc.next(); } catch (LdapException e) { Console.WriteLine("Error: " + e.LdapErrorMessage); // Exception is thrown, go for next entry continue; } Console.WriteLine("/n" + nextEntry.DN); LdapAttributeSet attributeSet = nextEntry.getAttributeSet(); System.Collections.IEnumerator ienum = attributeSet.GetEnumerator(); while (ienum.MoveNext()) { LdapAttribute attribute = (LdapAttribute)ienum.Current; string attributeName = attribute.Name; string attributeVal = attribute.StringValue; Console.WriteLine(attributeName + "value:" + attributeVal); } } ldapConn.Disconnect(); Console.ReadKey(); } public static bool MySSLHandler(Syscert.X509Certificate certificate, int[] certificateErrors) { X509Store store = null; X509Stores stores = X509StoreManager.CurrentUser; //string input; store = stores.TrustedRoot; X509Certificate x509 = null; X509CertificateCollection coll = new X509CertificateCollection(); byte[] data = certificate.GetRawCertData(); if (data != null) x509 = new X509Certificate(data); return true; }


Finalmente encontré la manera de hacer que esto funcione.

Primero, estas publicaciones me ayudaron a seguir el camino correcto: http://directoryprogramming.net/forums/thread/788.aspx

En segundo lugar, obtuve un dll compilado de la Biblioteca LDAP de Novell y usé el Mono.Security.Dll.

La solución:

Agregué esta función al código

// This is the Callback handler - after "Binding" this is called public bool MySSLHandler(Syscert.X509Certificate certificate, int[] certificateErrors) { X509Store store = null; X509Stores stores = X509StoreManager.LocalMachine; store = stores.TrustedRoot; //Import the details of the certificate from the server. X509Certificate x509 = null; X509CertificateCollection coll = new X509CertificateCollection(); byte[] data = certificate.GetRawCertData(); if (data != null) x509 = new X509Certificate(data); //List the details of the Server //if (bindCount == 1) //{ Response.Write("<b><u>CERTIFICATE DETAILS:</b></u> <br>"); Response.Write(" Self Signed = " + x509.IsSelfSigned + " X.509 version=" + x509.Version + "<br>"); Response.Write(" Serial Number: " + CryptoConvert.ToHex(x509.SerialNumber) + "<br>"); Response.Write(" Issuer Name: " + x509.IssuerName.ToString() + "<br>"); Response.Write(" Subject Name: " + x509.SubjectName.ToString() + "<br>"); Response.Write(" Valid From: " + x509.ValidFrom.ToString() + "<br>"); Response.Write(" Valid Until: " + x509.ValidUntil.ToString() + "<br>"); Response.Write(" Unique Hash: " + CryptoConvert.ToHex(x509.Hash).ToString() + "<br>"); // } bHowToProceed = true; if (bHowToProceed == true) { //Add the certificate to the store. This is /Documents and Settings/program data/.mono. . . if (x509 != null) coll.Add(x509); store.Import(x509); if (bindCount == 1) removeFlag = true; } if (bHowToProceed == false) { //Remove the certificate added from the store. if (removeFlag == true && bindCount > 1) { foreach (X509Certificate xt509 in store.Certificates) { if (CryptoConvert.ToHex(xt509.Hash) == CryptoConvert.ToHex(x509.Hash)) { store.Remove(x509); } } } Response.Write("SSL Bind Failed."); } return bHowToProceed; }

Y lo usé en el proceso de encuadernación

// Create Connection LdapConnection conn = new LdapConnection(); conn.SecureSocketLayer = true; Response.Write("Connecting to:" + ldapHost); conn.UserDefinedServerCertValidationDelegate += new CertificateValidationCallback(MySSLHandler); if (bHowToProceed == false) conn.Disconnect(); if (bHowToProceed == true) { conn.Connect(ldapHost, ldapPort); conn.Bind(loginDN, password); Response.Write(" SSL Bind Successfull "); conn.Disconnect(); } quit = false;

Los elementos clave son el uso del controlador de SSL para obtener dinámicamente el certificado y el uso de X509StoreManager.LocalMachine para que, cuando el sitio web se esté ejecutando, pueda guardar y recuperar los certificados.


Trabajo en la integración de Forefront Identity Manager. Entonces, el código que escribo siempre proviene de unos pocos clientes llamantes. Esto puede no ser apropiado si está intentando empaquetar una aplicación para usar "en cualquier lugar".

Solo quería actualizar este hilo con una solución simple para los servidores de Novell que tienen habilitada la opción "confidencialidad requerida" de TLS / SSL predeterminada.

1) Asegúrese de obtener los certificados SSL del servidor Novell al que está vinculando también e inscribirlos en la tienda de confianza del cliente / servidor en ejecución. Normalmente hay dos 1 para la IP y para el nombre de host dependiente al que llamará (DNS preferible)

2) Importar las siguientes / agregar referencias usando System.DirectoryServices; utilizando System.DirectoryServices.Protocols;

3) Aquí hay un fragmento. Asegúrese de elegir AuthenticationTypes.SecureSocketsLayer, que es la clave.

// serverAddress = Server IP or DNS (Match SSL certificate) // ObjectDN = The DN of the user you are binding to // userName = Account which will be used to make the bind // password = password of the user which will make the bind // value = The value you wish to add to the attribute // Connect to the user in LDAP DirectoryEntry entry = new DirectoryEntry("LDAP://" + serverAddress + "/" + ObjectDN + "" , userName , password , AuthenticationTypes.SecureSocketsLayer); // Write the Updated attribute entry.Properties["attribute"].Value = value; // Read back the updated Attribute into a label label.Text = entry.Properties["attribute"].Value.ToString();


Después de mi publicación anterior: si tiene que usar una conexión segura, intente utilizar ldaps: // como prefijo de la dirección del servidor.

Si no hay soporte SSL / TLS, puede intentar esto : directrices y .NET wrapper para la biblioteca OpenLDAP.

Un punto importante: hay configuraciones para el nivel de seguridad TLS en OpenLDAP, por lo que si su servidor LDAP tiene un certificado autofirmado, debe importarlo por el lado del cliente o configurar TLS para no verificar la autoridad de firma * que es menos seguro por supuesto )