2012-08-03 28 views
12

Sto convalidando gli accessi utente utilizzando il modulo ldap di python. Quando l'accesso fallisce, ottengo un login ldap.INVALID_CREDENTIALS, ma questo può essere dovuto a una password errata o perché l'account è bloccato. L'account viene bloccato dopo il terzo tentativo.Rileva se un account utente di Active Directory è bloccato tramite LDAP in Python

Vorrei rilevare che l'account è bloccato e segnalarlo all'utente frustrato, anziché lo stesso messaggio di "accesso non valido".

ricerca di una soluzione che ho trovato:

  • La bandiera userAccountControl BLOCCATO non viene utilizzato da AD;
  • attributo
  • Il lockoutTime dovrebbe essere usato al posto

la query LDAP dovrei usare per trovare utenti bloccati è:

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

O per un utente specifico:

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

Ma questo non funziona, la query non restituisce risultati ogni volta.

risposta

7

Un valore pari a zero in lockoutTime significa che non è bloccato. Quindi, dovresti provare questo.

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

In realtà, la query precedente non è ancora corretta al 100%. Se si legge la stampa fine da MSDN, Microsoft suggerisce di aggiungere l'attributo Lockout-Time all'attributo Lockout-Duration e quindi confrontarlo con l'ora corrente. Questo perché esiste una cosa chiamata durata del blocco. Una volta passata la durata del blocco, l'utente viene sbloccato automaticamente. Zero in Lockout-Duration significa che l'account è bloccato per sempre finché l'amministratore non lo sblocca.

Vai a questa 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

ottengo 'ldap.FILTER_ERROR: { 'desc': 'filtro di ricerca Bad'} 'se si utilizza' (! lockoutTime = 0) ', o anche' (lockoutTime> 0) '. Solo '(! LockoutTime> = 1)' sembra evitarlo. –

3

Inoltre, ho scoperto che lockoutTime non è garantito per tutti gli utenti in ANNUNCIO (almeno nella nostra configurazione), ma verrà creato al raggiungimento del numero di tentativi di blocco falliti. Quindi nel controllo degli account bloccati, sarà richiesto anche il controllo di Nessuno o di un equivalente.

+3

Ho trovato questo anche il caso. L'attributo 'lockoutTime' non verrà impostato se l'utente non ha mai bloccato il proprio account. Se in qualsiasi momento hanno bloccato il proprio account e da allora hanno effettuato l'accesso, ma il loro account non è più bloccato, l'attributo verrà impostato su 0. – ChadSikorra

4

lockoutTime è un attributo <not set> quindi il modo più semplice è quello di utilizzare:

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

per le voci non vuoti.

Aggiornamento:

Tuttavia, questo valore è impostato anche quando la password scade, la password deve cambiare ecc

quindi ha bisogno di essere filtrata da:

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

a ottenere i casi in cui l'utente è bloccato perché ha violato la politica della password, ad esempio immessa erroneamente la password 5 volte.

1

utilizzare questa query per ottenere i migliori risultati,

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

0

ho trovato anche questo elenco di bandiere di proprietà: 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 

è necessario effettuare un binario-E della proprietà userAccountControl con 0x002. Al fine di ottenere tutti i bloccati (cioè disabilitato) conti è possibile utilizzare

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

Per operatore 1.2.840.113556.1.4.803 vedere LDAP Matching Rules

0

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

tornerà oggetti che sono gli utenti ed avere un presente attributo denominato lockoutTime che non è uguale a 0.

Problemi correlati