Pregunta

i necesidad de verificar si la contraseña es correcta para un usuario.

tengo este código:

 private bool checkOldPasswordValid(string password, string username)
    {
        using (DirectoryEntry entry = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"))
        {
            entry.Username = username;
            entry.Password = password;

            DirectorySearcher searcher = new DirectorySearcher(entry);

            searcher.Filter = "(objectclass=user)";
            try
            {
                searcher.FindOne();
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }
    }

pero luego buscador de directorios no es compatible con WinNt, por lo que he encontrado otra forma de bucle a través de todos los registros.

 foreach (DirectoryEntry dc in entry.Children)
            {
                // prints the name
                System.Diagnostics.Debug.WriteLine(dc.Name);
            }

pero esto sólo se pone el nombre y imposible verificar la contraseña.

Por favor, ayuda. gracias

¿Fue útil?

Solución

Para autenticate contra LDAP o WinNT, no se necesita ninguna DirectorySearcher. Sólo se necesita para obtener el NativeObject de la instancia DirectoryEntry. Aquí está un ejemplo de código que pueden guiar a través del camino.

public bool Authenticate(string username, string password, string domain) {
    bool authenticated = false;

    using (DirectoryEntry entry = new DirectoryEntry(@"WinNT://" + domain, username, password) {
        try {
            object nativeObject = entry.NativeObject;
            authenticated = true;
        } catch (DirectoryServicesCOMException ex) {
        }
    }

    return authenticated;
}

Este código devolverá o bien un usuario es auténtico o no. Una vez que se puede obtener la propiedad NativeObject el uso de esta instancia de clase DirectoryEntry, esto significa que el AD (o un equipo local) utilizan suplantación de conseguir este objeto. Si se obtiene el objeto sin tener una excepción lanzada, significa esto que el AD (o un equipo local) fue capaz de autenticar al usuario impersonnated.

Si bien se puede utilizar el usuario actualmente autenticado mediante la especificación de ningún nombre de usuario y contraseña, pero sólo el dominio (o un equipo local), especificando un nombre de usuario y contraseña, usted dice que desea utilizar impersonnation, por lo que la infraestructura de seguridad utilizará el dado nombre de usuario y contraseña para tratar de recuperar la propiedad NativeObject de esta instancia de clase DirectoryEntry.

para la autenticación en el AD, basta con sustituir el "WinNT://" para "LDAP://".

Otros consejos

Puede utilizar DirectoryEntry sí mismo.

Vea el ejemplo aquí: http://support.microsoft.com/kb/316748

¿Por qué utiliza WinNT: // todos modos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top