2012-08-03 89 views
12

Estoy validando los inicios de sesión de los usuarios mediante el módulo ldap de python. Cuando falla el inicio de sesión, recibo un inicio de sesión ldap.INVALID_CREDENTIALS, pero puede ser debido a una contraseña incorrecta o porque la cuenta está bloqueada. La cuenta se bloquea después del tercer intento.Detectar si una cuenta de usuario de Active Directory está bloqueada mediante LDAP en Python

Me gustaría detectar que la cuenta está bloqueada e informar al usuario frustrado, en lugar del mismo mensaje de "inicio de sesión inválido".

búsqueda de una solución que encontré:

  • La bandera userAccountControl bloqueado no es utilizado por AD;
  • atributo
  • El lockoutTime debe utilizarse en lugar

La consulta LDAP que debería usar para encontrar usuarios bloqueados es:

(&(objectClass=user)(lockoutTime>=1)) 

O para un usuario específico:

(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1)) 

Pero esto no funciona, la consulta no devuelve resultados cada vez.

Respuesta

7

Un valor de cero en lockoutTime significa que no está bloqueado. Entonces, deberías probar esto.

(&(objectClass=user)(!lockoutTime=0)) 

En realidad, la consulta anterior todavía no es 100% correcta. Si lee la letra pequeña de MSDN, Microsoft le está sugiriendo que agregue el atributo Lockout-Time al atributo Lockout-Duration y luego lo compare con la hora actual. Eso es porque existe tal cosa llamada duración del bloqueo. Una vez que pasa la duración del bloqueo, el usuario se desbloquea automáticamente. Cero en Lockout-Duration significa que la cuenta está bloqueada para siempre hasta que el administrador la desbloquee.

ver este MSDN article

This attribute value is only reset when the account is logged onto successfully. This means that this value may be non zero, yet the account is not locked out. To accurately determine if the account is locked out, you must add the Lockout-Duration to this time and compare the result to the current time, accounting for local time zones and daylight savings time.

+0

obtengo 'ldap.FILTER_ERROR: { 'desc': 'filtro de búsqueda Bad'} 'si se usa' (! lockoutTime = 0) ', o incluso' (lockoutTime> 0) '. Solo '(! LockoutTime> = 1)' parece evitar esto. –

3

Además, he encontrado que lockoutTime no está garantizada para todos los usuarios en AD (al menos en nuestra configuración), pero se creará al alcanzar el número de intentos de bloqueo fallidos. Por lo tanto, al verificar cuentas bloqueadas, también se requerirá verificar None o un equivalente.

+3

Descubrí que este es el caso también. El atributo 'lockoutTime' no se establecerá si el usuario nunca ha bloqueado su cuenta. Si en algún momento han bloqueado su cuenta y han iniciado sesión, pero su cuenta ya no está bloqueada, entonces el atributo se establecerá en 0. – ChadSikorra

4

lockoutTime es un atributo <not set> lo que la forma más sencilla es utilizar:

(&(objectClass=user)(lockoutDuration=*))) 

para las entradas que no estén vacíos.

Actualización:

Sin embargo, este valor también se establece cuando caduque la contraseña, la contraseña tiene que cambiar, etc.

por lo que debe ser filtrado por:

UserPrincipal userPrincipal = new UserPrincipal(context); 
bool isLocked = userPrincipal.IsAccountLockedOut(); 

a obtener los casos en los que el usuario está bloqueado porque violaron la política de contraseñas, por ejemplo, ingresó la contraseña 5 veces incorrectamente.

1

utilizar esta consulta para obtener los mejores resultados,

Get-ADUser -LDAPFilter "(& (objectCategory = persona) (objectClass = user) (lockoutTime> = 1))" -Propiedades LockedOut

0

he encontrado también esta lista de banderas de propiedad: How to use the UserAccountControl flags

SCRIPT 0x0001 1 
ACCOUNTDISABLE 0x0002 2 
HOMEDIR_REQUIRED 0x0008 8 
LOCKOUT 0x0010 16 
PASSWD_NOTREQD 0x0020 32 
PASSWD_CANT_CHANGE 0x0040 64 
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128 
TEMP_DUPLICATE_ACCOUNT 0x0100 256 
NORMAL_ACCOUNT 0x0200 512 
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048 
WORKSTATION_TRUST_ACCOUNT 0x1000 4096 
SERVER_TRUST_ACCOUNT 0x2000 8192 
DONT_EXPIRE_PASSWORD 0x10000 65536 
MNS_LOGON_ACCOUNT 0x20000 131072 
SMARTCARD_REQUIRED 0x40000 262144 
TRUSTED_FOR_DELEGATION 0x80000 524288 
NOT_DELEGATED 0x100000 1048576 
USE_DES_KEY_ONLY 0x200000 2097152 
DONT_REQ_PREAUTH 0x400000 4194304 
PASSWORD_EXPIRED 0x800000 8388608 
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216 
PARTIAL_SECRETS_ACCOUNT 0x04000000  67108864 

Usted debe hacer un binario y de la propiedad userAccountControl con 0x002. Con el fin de obtener toda bloqueado (es decir, personas con discapacidad) representa puede utilizar

(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)) 

Para operador 1.2.840.113556.1.4.803 ver LDAP Matching Rules

0

(& (objectClass = user) (& (lockoutTime = *) (! (LockoutTime = 0))))

Will devolver los objetos que son usuarios y tienen un atributo llamado lockoutTime presente que no es igual a 0.

Cuestiones relacionadas