Verificar si la contraseña es correcta
-
30-09-2019 - |
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
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