根据Active Directory历史记录检查新密码(也许是复杂性策略)?

时间:2018-02-16 13:22:36

标签: .net active-directory

我有应用程序,允许用户更改其密码。这些用户存储在Active Directory中。在密码更改时,我需要应用密码策略。复杂性政策很容易。但是,如果密码必须与此用户的最后20个密码不同,该怎么办?无论如何可以使用AD用户的密码历史记录吗?

我知道AD会为每个用户存储最后约20个密码的哈希列表。 Afaik无法检索该列表。但无论如何可以询问AD该列表是否包含密码?或者可以询问AD,如果根据AD配置定义的策略,密码是特定用户的有效新密码吗?

1 个答案:

答案 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");

然后阅读这些属性: