我正在运行一个ASP.NET应用程序,该应用程序更改用户的密码。每次调用ChangePassword方法时,都会抛出PasswordException“指定的网络密码不正确。”,即使当前密码已经通过验证也是如此。
如果我输入无效的当前密码,则会抛出异常。这是预期结果。
如果我输入有效的当前密码,则会抛出异常,但密码仍然被更改了(我已经在更改后立即测试过验证)。
代码非常简单:
如果我输入无效的当前密码,则会抛出异常。这是预期结果。
如果我输入有效的当前密码,则会抛出异常,但密码仍然被更改了(我已经在更改后立即测试过验证)。
代码非常简单:
var context = new PrincipalContext(ContextType.Domain, "domain.net");
var valid = context.ValidateCredentials(username, oldPassword);
var userPrincipal = UserPrincipal.FindByIdentity(context, username);
userPrincipal.ChangePassword(oldPassword, newPassword);
每次操作时,不管当前密码是否正确,都会导致抛出以下异常:
System.DirectoryServices.AccountManagement.PasswordException: The specified network password is not correct. (Exception from HRESULT: 0x80070056) ---> System.Runtime.InteropServices.COMException: The specified network password is not correct. (Exception from HRESULT: 0x80070056)
--- End of inner exception stack trace ---
at System.DirectoryServices.AccountManagement.SDSUtils.ChangePassword(DirectoryEntry de, String oldPassword, String newPassword)
at System.DirectoryServices.AccountManagement.ADStoreCtx.ChangePassword(AuthenticablePrincipal p, String oldPassword, String newPassword)
at StudentAccountManager.ChangeUserPassword(String username, String oldPassword, String newPassword)
有用的信息:
- 托管网站的域名(例如webdomain.net)与更改密码所在的域不同。
- domain.net中有三个域控制器,其中一个是只读的。
- 两个域控制器位于现场。另一个在外场。PDC位于现场。
- 如果在PrincipalContext中使用任何特定的域控制器(例如dc1.domain.net,dc2.domain.net),一切正常(已测试所有三个)。
- 当在PrincipalContext中指定domain.net时,userPrincipal.SetPassword方法可以正确工作。
- 运行应用程序池的用户帐户具有更改和设置domain.net上密码的权限
- 域之间存在单向信任(domain.net信任webdomain.net)
- Web服务器运行Windows Server 2012 R2,domain.net上的域控制器运行Windows Server 2008 R2
我最好的猜测是凭证验证和更改密码请求发送之间存在时间问题。可能新凭据正在被验证针对尚未收到更改密码请求的域控制器?这将导致抛出异常,但密码仍然会更改。
UserPrincipal.ChangePassword()
仍然会抛出此异常。 - Ellesedil