¿Cómo puedo validar un nombre de usuario y contraseña en Active Directory? Simplemente quiero verificar si un nombre de usuario y contraseña son correctos.
c#
authentication
active-directory
Bagazo
fuente
fuente
UserPrinciple.FindByIdentity
para ver si el ID de usuario pasado existe primero.ContextOptions.Negotiate
.Hacemos esto en nuestra Intranet
Tienes que usar System.DirectoryServices;
Aquí están las entrañas del código
fuente
strPassword
se almacena en LDAP en texto sin formato?Close()
unausing
variable.Varias soluciones presentadas aquí carecen de la capacidad de diferenciar entre un usuario / contraseña incorrecto y una contraseña que debe cambiarse. Eso se puede hacer de la siguiente manera:
Si la contraseña del usuario es incorrecta o el usuario no existe, el error contendrá
"8009030C: LdapErr: DSID-0C0904DC, comentario: error AcceptSecurityContext, datos 52e, v1db1",
Si la contraseña del usuario necesita ser cambiada, contendrá
"8009030C: LdapErr: DSID-0C0904DC, comentario: error AcceptSecurityContext, datos 773, v1db1"
El
lexc.ServerErrorMessage
valor de los datos es una representación hexadecimal del código de error Win32. Estos son los mismos códigos de error que se devolverían invocando la llamada a la API Win32 LogonUser. La siguiente lista resume un rango de valores comunes con valores hexadecimales y decimales:fuente
System.DirectoryServices
ySystem.DirectoryServices.Protocols
solución muy simple usando DirectoryServices:
Se requiere el acceso de NativeObject para detectar un usuario / contraseña incorrecto
fuente
PrincipleContext
, que solo existe en .NET 3.5. Pero si está utilizando .NET 3.5 o más reciente, debería usarloPrincipleContext
Lamentablemente, no existe una forma "simple" de verificar las credenciales de los usuarios en AD.
Con cada método presentado hasta ahora, puede obtener un falso negativo: las credenciales de un usuario serán válidas, sin embargo, AD devolverá falso en ciertas circunstancias:
ActiveDirectory no le permitirá usar LDAP para determinar si una contraseña no es válida debido al hecho de que un usuario debe cambiar la contraseña o si su contraseña ha caducado.
Para determinar el cambio de contraseña o la contraseña caducada, puede llamar a Win32: LogonUser () y verificar el código de error de Windows para las siguientes 2 constantes:
fuente
Probablemente la forma más fácil es PInvocar LogonUser Win32 API.eg
Referencia de MSDN aquí ...
Definitivamente quiero usar el tipo de inicio de sesión
Esto crea solo un token liviano, perfecto para verificaciones AuthN. (se pueden usar otros tipos para crear sesiones interactivas, etc.)
fuente
LogonUser
API requiere que el usuario tenga la Ley como parte del privilegio del sistema operativo ; que no es algo que obtienen los usuarios, y no es algo que desea otorgar a cada usuario de la organización. ( msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )Una solución .Net completa es usar las clases del espacio de nombres System.DirectoryServices. Permiten consultar un servidor AD directamente. Aquí hay una pequeña muestra que haría esto:
Este código se conecta directamente al servidor AD, utilizando las credenciales proporcionadas. Si las credenciales no son válidas, searcher.FindOne () arrojará una excepción. El Código de error es el que corresponde al error COM de "nombre de usuario / contraseña inválido".
No necesita ejecutar el código como usuario de AD. De hecho, ¡lo uso con éxito para consultar información en un servidor AD, desde un cliente fuera del dominio!
fuente
Otra llamada .NET para autenticar rápidamente las credenciales LDAP:
fuente
Pruebe este código (NOTA: se informó que no funciona en Windows Server 2000)
excepto que necesitará crear su propia excepción personalizada para "LogonException"
fuente
Si está atascado con .NET 2.0 y el código administrado, esta es otra forma de trabajar con cuentas locales y de dominio:
fuente
La autenticación de Windows puede fallar por varias razones: un nombre de usuario o contraseña incorrectos, una cuenta bloqueada, una contraseña caducada y más. Para distinguir entre estos errores, llame a la función API LogonUser a través de P / Invoke y verifique el código de error si la función devuelve
false
:Uso de la muestra:
Nota: LogonUser requiere una relación de confianza con el dominio contra el que se valida.
fuente
Mi simple función
fuente
Aquí mi solución de autenticación completa para su referencia.
Primero, agregue las siguientes cuatro referencias
fuente