У нас есть несколько контроллеров AD в нашей настройке, и метод PrincipalContext.ValidateCredentials всегда будет возвращать false на контроллерах AD на серверах Windows 2003 для пользователей с установленным флажком «пользователь должен изменить пароль при следующем входе в систему».
Но на серверах под управлением Windows 2008 R2 он вернул бы true, если бы кредиты были действительны, даже если флажок был установлен.
Так что я просто убедился, что мой код попал в одну изWindows 2008 R2 серверов, и это сделало свое дело.
Я работал над решением для серверов 2003 года (прежде чем я понял, что все будет работать на других).Вот код:
var adContext = new PrincipalContext(ContextType.Domain, adLocation, adContainer, adAdminUsername, adAdminPassword);
var initialValidation = adContext.ValidateCredentials(username, password);
Console.WriteLine("Initial validation returned: " + initialValidation);
if (!initialValidation)
{
// maybe validation failed because "user must change password at next logon".
// let's see if that is the case.
var user = UserPrincipal.FindByIdentity(adContext, username);
if (user.LastPasswordSet == null)
{
// the user must change his password at next logon. So this might be
// why validation returned false
// uncheck the "change password" checkbox and attempt validation again
var deUser = user.GetUnderlyingObject() as DirectoryEntry;
var property = deUser.Properties["pwdLastSet"];
property.Value = -1;
deUser.CommitChanges();
// property was unset, retry validation
adContext.ValidateCredentials(username, password);
Console.WriteLine("Secondary validation returned: " + adContext.ValidateCredentials(username, password));
// re check the checkbox
property.Value = 0;
deUser.CommitChanges();
}
}