Я использую клиент С# для подключения к экземпляру OpenLDAP.
Мне нужно проверить, что пользователь вводит правильный старый пароль. Если эта проверка завершается успешно, мне нужно обновить свой атрибут userPassword новым паролем.
Я продолжаю получать DirectoryOperationException: A value in the request is invalid.
Здесь код:
public static void UpdateUserPassword(ref UserProfile user, string oldPassword, string newPassword) {
string connAccountName = ControllerHelper.GetProperty("VSP_SECURITY_PRINCIPAL", true);
string connAccountPassword = ControllerHelper.GetProperty("VSP_SECURITY_CREDENTIALS", true);
int myConnectionId;
LdapConnection ldapConnection;
lock (_sConnectionTable.SyncRoot) {
myConnectionId = _getFirstOpenConnectionId();
ldapConnection = _getConnectionFromPool(ref myConnectionId);//check for null
}
try {
/*Here is where I try to validate the user old password*/
ldapConnection.Bind(new NetworkCredential(user.dnName, oldPassword));
ModifyRequest request = new ModifyRequest(
user.dnName,
DirectoryAttributeOperation.Replace,
"userPassword",
newPassword
);
ModifyResponse modResponse = (ModifyResponse)ldapConnection.SendRequest(request);
user.state.successMsg = "Yay it worked!";
}
catch (Exception e) {
user.state.errorMsg = e.Message;
}
finally {
_releaseConnectionToPool(myConnectionId);
}
}
Любая помощь будет оценена по достоинству. Благодарю!
в.NET Framework 3.5 и выше вы можете использовать System.DirectoryServices.AccountManagement, что значительно упростит ситуацию.
приведенный ниже пример может решить вашу проблему
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");
if(user != null)
{
user.ChangePassword(oldPassword, newPassword);
user.UnlockAccount();
}
}
Я думаю, что последний параметр ModifyRequest в ctor, который вы используете, ожидает массив объектов, и вы передаете только одно значение, которое, вероятно, вызывает вашу ошибку.
Я бы использовал это вместо строки ModifyRequest
DirectoryAttributeModification modifyUserPassword = new DirectoryAttributeModification();
modifyUserPassword.Operation = DirectoryAttributeOperation.Replace;
modifyUserPassword.Name = "userPassword";
modifyUserPassword.Add(newPassword);
ModifyRequest modifyRequest = new ModifyRequest(user.dnName, modifyUserPassword);