c# active-directory active-directory-group

Validar usuarios de Active Directory remoto en C#



active-directory active-directory-group (1)

Primero algunos conceptos básicos (independientemente de esta pregunta)

Autenticación

El sistema verifica si Bob es realmente Bob. En un entorno de Active Directory, esto generalmente se hace con un inicio de sesión de dominio desde la estación de trabajo, Bob ingresa su nombre de usuario y contraseña, y obtiene un ticket de Kerberos. Más tarde, si quiere acceder, por ejemplo, a un archivo compartido en un servidor de archivos remoto, ya no necesita iniciar sesión y puede acceder a los archivos sin ingresar el nombre de usuario / contraseña.

Autorización

El sistema verifica a qué recursos tiene acceso Bob. Por lo general, Bob está en grupos de dominio y un grupo está en la lista de control de acceso (ACL) del recurso.

Si hay múltiples dominios de confianza, Bob necesita iniciar sesión en un dominio y puede acceder a los recursos en todos los demás dominios. Esta es una de las principales razones para usar Active Directory: inicio de sesión único

Comprobando si el usuario / contraseña es válido

Si tiene un nombre de usuario y contraseña y desea verificar si la contraseña es válida, debe iniciar sesión en el dominio. No hay forma de simplemente "verificar si la contraseña es correcta". El inicio de sesión significa: si hay una "cuenta de bloqueo de la política de seguridad si hay más de 3 inicios de sesión no válidos", la cuenta se bloqueará al verificar con una contraseña incorrecta, incluso si "solo desea verificar el usuario + contraseña".

Uso de las funciones del servicio de directorio .NET

Supongo aquí que el proceso es ejecutado por una cuenta humana como un programa normal, o el programa es un servicio de Windows o una tarea programada que se ejecuta bajo una cuenta de dominio de "usuario técnico". En este caso, no necesita proporcionar credenciales para usar las funciones AD. Si se accede a otros dominios de confianza de AD, esto también es cierto. Si desea iniciar sesión en un "dominio extranjero" y no hay confianza, debe proporcionar un nombre de usuario + contraseña (como en su código).

"Manualmente" autenticando a un usuario

Normalmente, esto no debería ser necesario. Ejemplo: uso de la intranet de ASP.NET. El usuario accede a una aplicación web en el dominio actual o el dominio de confianza, la autenticación se realiza "en segundo plano" por el navegador y IIS (si la autenticación de Windows integrada está activada). Por lo tanto, nunca necesitará manejar contraseñas de usuario en la aplicación.

No veo muchos casos de uso donde el código maneja una contraseña.

Es posible que su programa sea una herramienta de ayuda para almacenar cuentas / contraseñas de usuario de emergencia. Y desea verificar periódicamente si estas cuentas son válidas.

Esta es una manera simple de verificar:

using System.DirectoryServices.AccountManagement; ... PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "192.168.1.1"); bool userValid = principalContext.ValidateCredentials(name, password);

También se pueden usar las funciones ADSI antiguas y sin formato:

using System.DirectoryServices; .... bool userOk = false; string realName = string.Empty; using (DirectoryEntry directoryEntry = new DirectoryEntry"LDAP://192.168.1.1/DC=ad,DC=local", name, password)) { using (DirectorySearcher searcher = new DirectorySearcher(directoryEntry)) { searcher.Filter = "(samaccountname=" + name + ")"; searcher.PropertiesToLoad.Add("displayname"); SearchResult adsSearchResult = searcher.FindOne(); if (adsSearchResult != null) { if (adsSearchResult.Properties["displayname"].Count == 1) { realName = (string)adsSearchResult.Properties["displayname"][0]; } userOk = true; } } }

Si su requisito real es en realidad una verificación de validez de usuario + contraseña, puede hacerlo de una de estas maneras.

Sin embargo, si se trata de una "aplicación normal", que solo quiere verificar si las credenciales ingresadas son válidas, debe reconsiderar su lógica. En este caso, es mejor que dependas de las capacidades de inicio de sesión único de AD.

Si hay más preguntas, por favor comente.

segundo. Nombre de usuario y contraseña de la máquina Remote Active Directory.

Esto suena un poco confuso Supongo que quiere decir "un nombre de usuario y la contraseña correspondiente en el dominio remoto".

También está el concepto de una cuenta de máquina, que es el nombre de host adjunto con $. Pero ese es otro tema.

Crear nuevo usuario

Opción 1

using (DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://192.168.1.1/CN=Users,DC=ad,DC=local", name, password)) { using (DirectoryEntry newUser = directoryEntry.Children.Add("CN=CharlesBarker", "user")) { newUser.Properties["sAMAccountName"].Value = "CharlesBarker"; newUser.Properties["givenName"].Value = "Charles"; newUser.Properties["sn"].Value = "Barker"; newUser.Properties["displayName"].Value = "CharlesBarker"; newUser.Properties["userPrincipalName"].Value = "CharlesBarker"; newUser.CommitChanges(); } }

opcion 2

using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "192.168.1.1", "CN=Users,DC=ad,DC=local", name, password)) { using (UserPrincipal userPrincipal = new UserPrincipal(principalContext)) { userPrincipal.Name = "CharlesBarker"; userPrincipal.SamAccountName = "CharlesBarker"; userPrincipal.GivenName = "Charles"; userPrincipal.Surname = "Barker"; userPrincipal.DisplayName = "CharlesBarker"; userPrincipal.UserPrincipalName = "CharlesBarker"; userPrincipal.Save(); } }

Lo dejo como ejercicio para descubrir qué atributo va dentro de qué campo de entrada del diálogo del usuario :-)

Intento autenticar a los usuarios que pertenecen a ActiveDirectory remoto desde mi máquina, que no es el mismo dominio que la máquina actual o el dominio de usuario. No habrá confianza entre mi máquina y la máquina ActiveDirectory remota.

Prueba inicial

Traté de autenticar a un usuario (Entrada: sAMAccountName, dirección IP de la máquina, nombre de usuario del dominio de la máquina ("Administrador") y contraseña de la máquina (***). Capaz de obtener el resultado de que el usuario con ''sAMAccountName'' existe en ActiveDirectory.

Mi requisito :

  1. Imagine que ya se ha creado un usuario ("qwerty") en ActiveDirectory

  2. Desde mi máquina local, tendré la siguiente información,

    a. Remote Active Directory ipaddress

    segundo. Nombre de usuario y contraseña de la máquina Remote Active Directory.

    do. Nombre de usuario y contraseña del usuario "qwerty"

  3. Necesito comprobar si el usuario "qwerty" está presente en la lista de usuarios de ActiveDirectory remoto y validar si la contraseña ingresada es la misma en la lista de usuarios de ActiveDirectory

Código que probé:

DirectoryEntry entry = new DirectoryEntry("LDAP://ipaddress/DC=dinesh,DC=com", name, password); DirectorySearcher searcher = new DirectorySearcher(entry); searcher.Filter = "(sAMAccountName=" + name + ")"; try { SearchResult adsSearchResult = adsSearcher.FindOne(); isValid = true; adsEntry.Close(); } catch (Exception ex) { adsEntry.Close(); }

¿Debo crear una confianza entre el equipo local y el equipo ActiveDirectory remoto antes de validar los usuarios en un ActiveDirectory remoto? En caso afirmativo, indique cómo se puede hacer;

Después de crear confianza, ¿cómo puedo validar a los usuarios?

=============================================== ======================

Puedo utilizar la solución sugerida por Rainer, pero con un problema nuevo. Cuando creo un nuevo usuario a través del código C # de una máquina diferente, algunas propiedades no se configuran correctamente.

¿Es necesario establecer esto de forma obligatoria al crear el usuario?