2009-04-20 32 views
10

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#. (Estoy totalmente di por vencido mediante ADSI y la creación de un componente COM nivel bajo)Cómo autenticar LDAP en .NET

La forma im intentar autenticar con Novel eDirecotory es que tengo 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, se me ha indicado que use el mismo código que direcotry activo, . pero la cadena LDAP connecton 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 utilizan una "cuenta de servicio:" lo que significa que necesito para unirse con un nombre de usuario y contraseña de administrador antes de que pueda autentica 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 que debería ir para la autenticación en cada servicio direcotory individuo?

2) Siento que no te tienes que 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 una 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

Respuesta

3

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.

11

No estoy seguro de entender del todo la pregunta, pero en algunas situaciones que he encontrado que sea fácil para autenticar a un usuario simplemente haciendo una búsqueda por su cuenta y usando sus credenciales como nombre de usuario y contraseña.

Una consulta exitosa significa todo lo previsto era correcta, al no encontrar la cuenta significa que algo estaba 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 "mejores prácticas", pero podría conseguir alrededor de su problema que está teniendo ...

+0

supongo que es solo microsoft AD y está usando LDAP. Gracias por el código. Mi pregunta es más una forma de universalizar, posiblemente no utilizar LDAP, ya que algunos servidores LDAP requieren un nombre de usuario y contraseña de la cuenta de servicio, solo para enlazar, por lo que incluso puede intentar autenticar a un usuario normal. –

+0

Eso es lo que sugiero: use las credenciales del usuario que inició sesión (suponiendo que esté solicitando su nombre de usuario y contraseña) como cuenta de servicio. Al menos deberían poder consultar y ver su propia cuenta. Si eso funciona, entonces sabrá que la autenticación funciona. Parece una forma bastante universal de verificar si una contraseña es correcta. – Hugoware

0

Tuvimos un sitio web que necesita para autenticar un nombre de usuario y la contraseña con credenciales de dominio y utiliza la API LogonUser función. Ú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.

+0

gracias por guiarme por el camino correcto. aunque tu derecho, necesitarás administrador local para hacer esta llamada de API, buscando en Google cosas, si lees este hilo dicen que hay una llamada de API que no requiere esto http://www.vbforums.com/showthread .php? t = 240277 AcquireCredentialsHandleNT con está en security.dll –

+0

Si está en 2003, entonces LogonUser no requiere SE_TCB_NAME. No creo que simplemente llamando a AcquireCredentialsHandle verifique que sean válidos. El código simula una verificación completa de autenticación de cliente/servidor. Sin embargo, no puedo ver nada malo con eso, aparte de las obvias cargas de código. – pipTheGeek

Cuestiones relacionadas