在MS补丁KB3167679之后更改c#/asp.net中的Active Directory用户密码

本文关键字:中的 net asp Active Directory 密码 用户 补丁 MS KB3167679 之后 | 更新日期: 2023-09-27 18:02:42

我目前正在寻找某种关于更改用户的活动目录用户密码的最佳实践,当用户登录到一个基于asp.net的web应用程序,密码过期,并在登录会话期间。

我们在Windows Server 2008 R2, IIS7和。net framework 3.5上运行应用程序

到目前为止,我使用的是:

public int changeUserPassword(String _userID, String _oldPassword, String _newPassword, bool _change)
{
    try
    {
        PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, "do.ma.in", "DC=do,DC=ma,DC=in",
        ContextOptions.SimpleBind, @"domain'admin_account", "admin_pw");
        UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, _userID);
        if (_change)
        {
            oUserPrincipal.ChangePassword(_oldPassword, _newPassword);
        }
        else
        {
            oUserPrincipal.SetPassword(_newPassword);
        }
        oUserPrincipal.Save();
    }
    catch (Exception e)
    {
        //error handling
    }
    return 1;
}

此方法处理用户在登录后发起的pw更改,在pw登录过期期间的更改(ChangePassword方法),以及密码重置,其中生成临时密码等(SetPassword方法)。

我们需要ChangePassword方法的原因是,因为我们不允许使用最近的x个密码,所以有一个关于当前密码的用户确认,因此应用了AD密码历史。SetPassword只是设置密码,不管它是否在最近的历史记录中。

SetPassword似乎仍然可以正常工作,但自从微软补丁KB3167679以来,更改密码方法似乎不再工作了。KB3167679这篇文章特别提到,这只发生在被锁定或禁用的帐户上,但当帐户处于活动状态或处于"密码过期"模式时,它也不再起作用。我得到的异常消息是"一个或多个输入参数无效"。

我以前使用了另一个使用DirectoryEntry的实现,但它是错误的,因为它有时工作,有时不工作,这是非常烦人的。所以我宁愿不回到那个。

我们在一个有新补丁的实例上观察到这一点,没有它的实例工作得很好。我还能够在测试服务器上重现该行为,该方法在上述补丁安装后停止工作。

不幸的是,微软没有在本文中提供最佳实践,我自己似乎也找不到。所以问题是如果你能给我点提示的话标准的方法是什么

在MS补丁KB3167679之后更改c#/asp.net中的Active Directory用户密码

我也遇到过类似的问题。尝试更改上下文选项。简单绑定到上下文选项。谈判