consultar - directorysearcher c# ejemplos
Active Directory-Verificar nombre de usuario/contraseƱa (4)
Estoy usando el siguiente código en Windows Vista Ultimate SP1 para consultar nuestro servidor de directorio activo y verificar el nombre de usuario y la contraseña de un usuario en un dominio.
public Object IsAuthenticated()
{
String domainAndUsername = strDomain + "//" + strUser;
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, strPass);
SearchResult result;
try
{
//Bind to the native AdsObject to force authentication.
DirectorySearcher search = new DirectorySearcher(entry) { Filter = ("(SAMAccountName=" + strUser + ")") };
search.PropertiesToLoad.Add("givenName"); // First Name
search.PropertiesToLoad.Add("sn"); // Last Name
search.PropertiesToLoad.Add("cn"); // Last Name
result = search.FindOne();
if (null == result)
{
return null;
}
//Update the new path to the user in the directory.
_path = result.Path;
_filterAttribute = (String)result.Properties["cn"][0];
}
catch (Exception ex)
{
return new Exception("Error authenticating user. " + ex.Message);
}
return user;
}
el objetivo es usar .NET 3.5 y compilarse con el estándar VS 2008
He iniciado sesión con una cuenta de dominio que es un administrador de dominio donde se ejecuta la aplicación.
El código funciona perfectamente en Windows XP; pero recibo la siguiente excepción al ejecutarlo en Vista:
System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
at System.DirectoryServices.DirectorySearcher.FindOne()
at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
at System.DirectoryServices.DirectorySearcher.FindOne()
at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()
He intentado cambiar los tipos de autenticación, no estoy seguro de lo que está pasando.
Ver también : ¿ Validar un nombre de usuario y contraseña en contra de Active Directory?
¿El enlace a LDAP requiere valores elevados (UAC)? Podría intentar ejecutar Visual Studio y / o la aplicación como administrador y ver si eso ayuda. Si ese es el problema, siempre puede agregar un manifiesto a la aplicación y configurarlo para que requiera elevación, de ese modo se le preguntará cuando un usuario lo ejecute.
No estoy seguro de por qué requeriría privs elevados, pero vale la pena intentarlo.
Lo descubrí de todos modos. Si pasas el dominio con el nombre de usuario en vista, no funciona como "dominio / usuario", así que simplemente pasar "usuario" parece funcionar bien, excepto que tienes que estar en el mismo dominio.
Si está utilizando .net 3.5 use este código en su lugar.
Para autenticar a un usuario:
PrincipalContext adContext = new PrincipalContext(ContextType.Domain);
using (adContext)
{
return adContext.ValidateCredentials(UserName, Password);
}
Si necesita encontrar el usuario para atributos R / W para el objeto, haga esto:
PrincipalContext context = new PrincipalContext(ContextType.Domain);
UserPrincipal foundUser =
UserPrincipal.FindByIdentity(context, "jdoe");
Esto está utilizando el espacio de nombres System.DirectoryServices.AccountManagement, por lo que deberá agregarlo a sus instrucciones de uso.
Si necesita convertir un objeto UserPrincipal a un objeto DirectoryEntry para que funcione con el código heredado, puede hacer esto:
DirectoryEntry userDE = (DirectoryEntry)foundUser.GetUnderlyingObject();
Encontré ese mismo código flotando en Internet en varios sitios web y no funcionó para mí. Steve Evans probablemente tenga razón en que si usa .NET 3.5, no debe usar este código. Pero si todavía está en .NET 2.0 puede intentar esto para Autenticar a sus servicios de AD:
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,
userName, password,
AuthenticationTypes.Secure | AuthenticationTypes.SecureSocketsLayer);
object nativeObject = entry.NativeObject;
La primera línea crea un objeto DirectoryEntry usando dominio, nombre de usuario y contraseña. También establece AuthenticationTypes. Observe cómo estoy configurando la autenticación segura (Kerberos) y SSL usando el operador "Bitwise OR" (''|'') entre los dos parámetros.
La segunda línea obliga al NativeObject de "entrada" a vincularse a los servicios de AD utilizando la información de la primera línea.
Si se lanza una excepción, entonces las credenciales (o configuraciones) fueron malas. Si no es una excepción, estás autenticado. El mensaje de excepción generalmente indicará qué salió mal.
Este código es bastante similar a lo que ya tienes, pero el dominio se usa donde tienes "ruta" y el nombre de usuario no se combina con el dominio. Asegúrese de configurar sus AuthenticationTypes correctamente también. Esto puede hacer o deshacer la capacidad de autenticarse.