我验证使用Python的LDAP模块的用户登录。 当登录失败,我得到一个ldap.INVALID_CREDENTIALS登录,但是这可能是是因为一个错误的密码,或因为该帐户被锁定。 该帐户中获得的第3次尝试后锁定。
我想检测到该帐户被锁定并报告给用户感到沮丧,而不是相同的“无效登录”消息。
寻找解决的办法,我发现:
- 该userAccountControl的LOCKED标志不使用AD;
- 该lockoutTime属性应改为使用
我应该使用查找锁定用户的LDAP查询:
(&(objectClass=user)(lockoutTime>=1))
或为特定用户:
(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))
但是,这是行不通的,该查询返回每次都没有结果。
的零值lockoutTime
意味着它不锁定。 所以,你应该试试这个。
(&(objectClass=user)(!lockoutTime=0))
其实,上面的查询仍然不是100%正确。 如果你读从MSDN印刷精美,微软建议你到添加Lockout-Time
属性的Lockout-Duration
与当前时间属性,然后进行比较。 这是因为有这样叫锁定时间的事情。 一旦锁定时间的推移,用户自动解锁。 零Lockout-Duration
意味着该帐户被永远锁,直到管理员解锁。
看到这个MSDN文章
当帐户登录到成功此属性值仅重置。 这意味着,这个值可能不为零,但该帐户未锁定。 为了准确地确定帐户被锁定,您必须将锁定,时间到这个时间和结果比较当前的时间,占本地时区和夏令时。
lockoutTime
是<not set>
属性,以便最简单的方法是使用:
(&(objectClass=user)(lockoutDuration=*)))
对于非空项。
更新:
然而,这个值密码过期也设置密码需要改变等等。
因此,需要通过过滤:
UserPrincipal userPrincipal = new UserPrincipal(context);
bool isLocked = userPrincipal.IsAccountLockedOut();
获得该用户将被锁定,因为他们违反了密码策略,例如输入了错误的密码5倍的情况。
另外,我发现lockoutTime不能保证在AD所有用户(至少在我们的配置),但会在到达锁定失败尝试的次数来创建。 因此,在检查锁定帐户,检查无或等同将需要为好。
我还发现属性标志的此列表: 如何使用UserAccountControl标志
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
你必须做一个二进制和财产userAccountControl
与0x002
。 为了得到所有锁定(即禁用)帐户,您可以使用
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))
对于运营商1.2.840.113556.1.4.803
见LDAP匹配规则
使用此查询,以获得最好的结果,
得到-ADUser便有-LDAPFilter “(&(objectCategory =人)(objectClass的=用户)(lockoutTime> = 1))” -Properties LockedOut
(&(objectClass的=用户)(&(lockoutTime = *)(!(lockoutTime = 0))))
将返回它们的用户和有一个名为lockoutTime当前属性,它不等于0的对象。