MS修补程序后在c#/ asp.net中更改Active Directory用户密码KB3167679
我目前正在寻找某种最佳做法,即在用户登录到某个用户时更改用户的活动目录用户密码基于asp.net的Web应用程序和密码已过期,并在登录会话。MS修补程序后在c#/ asp.net中更改Active Directory用户密码KB3167679
我们正在运行的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方法的原因是有一个关于当前密码的用户确认,所以AD密码历史被应用,因为我们不允许最后的x个密码。 SetPassword只是设置密码,不管它是否在最近的历史记录中。
SetPassword似乎仍然可以正常工作,但自Microsoft修补程序KB3167679以来,更改密码方法似乎不再有效。 KB3167679 该文章特别提到,这只会发生在被锁定或禁用的帐户,但当帐户处于活动状态或处于“密码过期”模式时,它也不再起作用。 异常消息I geet是“一个或多个输入参数无效”。
我以前使用过另一个使用DirectoryEntry的实现,但它有错误,因为它有时可以工作,有时它不会,这很烦人。所以我宁愿不回去。
我们在具有新补丁的实例上观察到这一点,没有它的实例可以正常工作。我还能够在测试服务器上重现该行为,该方法在安装所述修补程序后停止工作。
不幸的是,微软并没有提供这篇文章中的最佳实践,我似乎也无法找到自己的一个。所以问题是如果你对我有一个提示什么是标准的方式去这里。
我遇到过类似的问题。尝试将ContextOptions.SimpleBind更改为ContextOptions.Negotiate
非常感谢,这确实有用。到目前为止,我所有的测试都很成功如果它在特定情况下失败,我会报告。 – vm370