DirectoryServices UserPrincipal.SetPassword忽略密码策略(密码历史记录)

本文关键字:密码 历史 记录 策略 DirectoryServices SetPassword UserPrincipal | 更新日期: 2023-09-27 18:21:25

正如标题所示,在设置用户密码时,我遇到了一个关于尊重密码策略的问题,特别是密码历史记录限制。

该场景是在用户不知道其当前密码时重置用户密码。我使用以下方法来实现这一点:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "XXXX", "ADMINUSER", "ADMINPASSWORD")) {
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username)) {
        user.SetPassword(password);
    }
}

这对每个策略都有效,不受密码历史记录限制。

现在假设这个场景,当用户想要更改他们的密码并且知道他们当前的密码时,我使用的是:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "XXXX.XXX.com")) {
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username)) {
        user.ChangePassword(currentPassword, newPassword);
    }
}

它按预期工作,并针对所有密码策略限制进行验证。

有人不得不处理这个吗?

干杯:)

DirectoryServices UserPrincipal.SetPassword忽略密码策略(密码历史记录)

这是我使用过的设计。SetPassword旨在充当重置用户密码的管理员-复杂性策略有效,但对历史记录没有限制。假设管理员重置了你的密码,看到"不能设置相同的密码"——你的一个密码被泄露了。

我们的解决方法是允许管理层只通过我们的一个web子系统,并保留哈希的历史记录,以便将验证历史记录的责任放在自定义子系统上,而不是广告上。

我知道这是一篇旧帖子,但我们从未找到可接受的答案。我们的系统人员不喜欢为历史存储我们自己的散列。我们最终实现了这样的解决方案:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, 
        "XXXX","ADMINUSER", "ADMINPASSWORD"))
{
    using (UserPrincipal user = 
        UserPrincipal.FindByIdentity(context,IdentityType.SamAccountName, username)) 
    {
        string tempPassword = Guid.NewGuid().ToString();
        user.SetPassword(tempPassword);
        user.ChangePassword(tempPassword, password);
    }
}

我们将该人的密码重置为一个随机的、足够长且复杂的密码,我们的代码知道这个密码。然后,我们在更改过程中使用该密码作为旧密码,使用用户键入的新密码。如果该过程未通过包括密码历史记录在内的策略检查,我们会将该错误传回最终用户,他们必须重试。

如果未通过FindByIdentification找到用户名,您可能还需要先检查其是否为null!

using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "XXXX.XXX.com")) {
    using (UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username))
    {
        if (user != null)
        {
            user.ChangePassword(currentPassword, newPassword);
        }
        else
        {
            throw new Exception(string.Format("Username not found: {0}", username));
        }
    }
}