Valide a los usuarios de Active Directory remoto en C #

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

Intenté autenticar a un usuario (Entrada: sAMAccountName, ipaddress de la máquina, nombre de usuario del dominio de la máquina (“Administrador”) y contraseña de la máquina (***). Se puede obtener el resultado de que el usuario con ‘sAMAccountName’ existe en ActiveDirectory.

Mi requerimiento

  1. Imagina que ya se ha creado un usuario (“qwerty”) en ActiveDirectory

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

    a. Dirección remota de ActiveDirectory

    segundo. Nombre de usuario y contraseña de la máquina ActiveDirectory remoto.

    do. Nombre de usuario y contraseña del usuario “qwerty”

  3. Necesito verificar si el Usuario “qwerty” está presente en la lista de usuarios remotos de ActiveDirectory 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 la máquina local y la máquina remota de ActiveDirectory antes de validar a los usuarios en un ActiveDirectory remoto? Si es así, por favor diga cómo se puede hacer;

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

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

Soy capaz de usar la solución sugerida por Rainer, pero con un nuevo problema. Cuando creo un nuevo usuario a través del código C # desde una máquina diferente, algunas propiedades no se configuran correctamente. Propiedades no establecidas al crear usuario

¿Es necesario configurar esto obligatoriamente al crear un usuario?

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 desea acceder, por ejemplo, a un recurso compartido de archivos 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 puede acceder Bob. Normalmente, Bob está en grupos de dominio y un grupo está en la ACL (lista de control de acceso) del recurso.

Si hay varios 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 razones principales por las que se usa Active Directory: inicio de sesión único

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

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”. Significa iniciar sesión: si hay una política de seguridad “bloquear cuenta si hay más de 3 inicios de sesión no válidos”, la cuenta quedará bloqueada con una contraseña incorrecta, incluso si “solo desea verificar la contraseña del usuario +”.

Usando las funciones del servicio de directorio .NET

Supongo que aquí el proceso es ejecutado por una cuenta humana como un progtwig normal, o el progtwig es un servicio de Windows o una tarea progtwigda que se ejecuta bajo una cuenta de “usuario técnico” de dominio. En este caso, no es necesario que proporcione credenciales para usar las funciones de AD. Si accede a otros dominios de AD confiables, 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” autentificando 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 en el dominio que confía, la autenticación se realiza “en segundo plano” mediante el navegador y IIS (si la autenticación de Windows integrada está activada). Por lo tanto, nunca necesita manejar contraseñas de usuario en la aplicación.

No veo muchos casos de uso donde una contraseña es manejada por código.

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

Esta es una forma sencilla de comprobar:

 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 sin formato más antiguas:

 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 la contraseña de usuario +, puede hacerlo de una de estas formas.

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 confíe en las capacidades de inicio de sesión único de AD.

Si hay más preguntas, por favor comentar.

segundo. Nombre de usuario y contraseña de la máquina ActiveDirectory remoto.

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

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


Creando 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(); } } 

Dejo un ejercicio para que averigüe qué atributo va a qué campo de entrada del diálogo de Usuario 🙂