c# - Cómo autenticar LDAP en.NET
novell (3)
Me gustaría autenticar el nombre de usuario y las contraseñas de mi aplicación en un sistema operativo de Windows con cualquier servicio de directorio. Por ejemplo, podría ser el directorio activo de Microsoft, Novell eDirecotry o SunOne. Ya sé cómo hacer este código de forma nativa para Microsoft Active Direcotry con c #. (Me rendí por completo usando ADSI y creando un componente de bajo nivel de com)
La forma en que intento autenticarme con Novell eDirecotory es que he instalado el proyecto Mono. Dentro del proyecto mono, le proporcionan Novell.Directory.ldap.dll. El código tiene el mismo aspecto que el de Microsoft Active Directory. ( Http://www.novell.com/coolsolutions/feature/11204.html )
Para SunOne, me dijeron que use el mismo código que el directorio activo, pero la cadena de conexión ldap es un poco diferente. ( Http://forums.asp.net/t/354314.aspx ) ( http: // technet. microsoft.com/en-us/library/cc720649.aspx )
Para complicar mi proyecto, la mayoría de los clientes usan una "Cuenta de servicio", lo que significa que debo vincularme con un nombre de usuario y contraseña administrativos antes de poder autenticar un nombre de usuario y contraseña regulares. Mis preguntas están en 2 partes.
1) Por lo que he explicado anteriormente, ¿es esta la dirección correcta en la que debo autenticarme contra cada servicio directivo individual?
2) Siento que no necesito hacer nada de este código en absoluto. También creo que la estipulación de usar una cuenta de servicio no es en absoluto importante. Si todo lo que me importa es autenticar un nombre de usuario y contraseña en una máquina con Windows, ¿por qué incluso necesito usar ldap? Quiero decir pensar en eso. Cuando se conecta a su máquina por la mañana, no tiene que proporcionar una cuenta de servicio solo para iniciar sesión. Puedo autenticar fácilmente un nombre de usuario y contraseña en un indicador de DOS utilizando la función runas y me serán denegados o no y podría analizar el archivo de texto. Estoy seguro de que hay otras maneras en que podría pasar un nombre de usuario y una contraseña al sistema operativo Windows en el que estoy y que me dirá si un nombre de usuario y contraseña son válidos para el dominio en el que están. Estoy en lo correcto? Si es así, ¿qué formas sugieres tienen ustedes?
Michael Evanchik www.MikeEvanchik.com
No estoy seguro de entender por completo la pregunta, pero en algunas situaciones he encontrado que es fácil autenticar a un usuario simplemente haciendo una búsqueda de su cuenta y usando sus credenciales como nombre de usuario y contraseña.
Una consulta exitosa significa que todo lo que se proporcionó fue correcto, no encontrar la cuenta significa que algo estuvo mal.
//use the users credentials for the query
DirectoryEntry root = new DirectoryEntry(
"LDAP://dc=domain,dc=com",
loginUser,
loginPassword
);
//query for the username provided
DirectorySearcher searcher = new DirectorySearcher(
root,
"(sAMAccountName=" + loginUser + ")"
);
//a success means the password was right
bool success = false;
try {
searcher.FindOne();
success = true;
}
catch {
success = false;
}
Probablemente no sea la "mejor práctica", pero podría solucionar su problema que está teniendo ...
Teníamos un sitio web que necesitaba autenticar un nombre de usuario y una contraseña en contra de las credenciales de dominio y usamos la función API LogonUser. Úselo para un inicio de sesión de red (uno de sus argumentos es el tipo de inicio de sesión) y todo lo que hace es validar las credenciales, no hace cosas como cargar el perfil de los usuarios que runas haría. La única advertencia es que la cuenta de servicio requiere suficiente acceso para llamar a LogonUser. Le sugiero que consulte la documentación de MSDN para saber a qué se accede, porque varía según el sistema operativo.
Todo esto se puede hacer con System.DirectoryServices.Protocols. Si crea una LdapConnection en el directorio, puede usar la cuenta de servicio para vincularse y luego realizar un enlace posterior para autenticar las credenciales.
La cuenta de servicio generalmente se usa para limitar el acceso al mecanismo de autenticación del servidor. De esta forma, ninguna persona al azar en la calle puede intentar autenticarse con su servidor LDAP.
Además, ¿espera que cada usuario proporcione su nombre completo cuando inicie sesión? Con Active Directory, solo se requiere sAMAccountName, pero otros proveedores como eDirectory y SunONE requieren el nombre completo para la autenticación.
Para realizar este tipo de autenticación, deberá usar la cuenta de servicio que se proporciona para autenticarse en el servidor, realizar una búsqueda de un usuario con el nombre de usuario dado y obtener el nombre completo de los usuarios. A continuación, puede autenticarse utilizando ese nombre completo y la contraseña que se proporcionó.
Esto funcionará para todos los sistemas LDAP, con la excepción de Active Directory que estará contento con solo el sAMAccountName.