我有应用程序,允许用户更改其密码。这些用户存储在Active Directory中。在密码更改时,我需要应用密码策略。复杂性政策很容易。但是,如果密码必须与此用户的最后20个密码不同,该怎么办?无论如何可以使用AD用户的密码历史记录吗?
我知道AD会为每个用户存储最后约20个密码的哈希列表。 Afaik无法检索该列表。但无论如何可以询问AD该列表是否包含密码?或者可以询问AD,如果根据AD配置定义的策略,密码是特定用户的有效新密码吗?
答案 0 :(得分:1)
不,AD不会泄露这些信息。检查密码是否良好的唯一方法是尝试更改密码。
但请注意,"更改"之间存在差异。密码和"设置"密码。
设置密码(或"重置")通常由管理员完成,密码历史记录策略不适用(您实际上可以将密码设置为已经存在的密码) ):
user.Invoke("SetPassword", newpassword);
更改密码是最终用户的操作,并且适用密码历史记录限制。在这种情况下,必须提供旧密码:
user.Invoke("ChangePassword", new object[] { oldpassword, newpassword });
如果失败,那么你知道那里有问题。它会告诉您旧密码是否错误,或者它会告诉您新密码是否错误。但是如果新密码与旧密码相同或者复杂性要求失败,它会给你同样的错误 - 它不会告诉你哪一个。
在这两种情况下,user
都是DirectoryEntry
个对象。
如果您想获得幻想,您可以弄清楚如何从AD中读取复杂性要求并确定给定的密码是否匹配。如果它匹配,但密码仍然被拒绝,那么您可以安全地假设密码历史记录是问题。
如果您没有使用Fine-Grained Password Policies(仅限于2008年以上),那么整个域只有一个策略,可以从域根目录中的属性中读取:
var domain = new DirectoryEntry("LDAP://domain.com");
然后阅读这些属性: