我目前正在寻找某种关于更改用户的活动目录用户密码的最佳实践,当用户登录到一个基于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, @"domainadmin_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的实现,但它是错误的,因为它有时工作,有时不工作,这是非常烦人的。所以我宁愿不回到那个。
我们在一个有新补丁的实例上观察到这一点,没有它的实例工作得很好。我还能够在测试服务器上重现该行为,该方法在上述补丁安装后停止工作。
不幸的是,微软没有在本文中提供最佳实践,我自己似乎也找不到。所以问题是如果你能给我点提示的话标准的方法是什么
我也遇到过类似的问题。尝试更改上下文选项。简单绑定到上下文选项。谈判