Изменение пароля пользователя в LDAP с использованием объекта C # LdapConnection

1

Я использую клиент С# для подключения к экземпляру 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);
        }

    }

Любая помощь будет оценена по достоинству. Благодарю!

  • 0
    Если вы отлаживаете, можете ли вы точно сказать, какая строка вызывает исключение - это строка проверки или строка смены пароля?
Теги:
ldap
asp.net-mvc

2 ответа

0

в.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();
    }
}
  • 1
    Я думал, что API был только для активной директории? Я подключаюсь к экземпляру OpenLDAP.
  • 0
    на самом деле это не очень хорошо работает вне AD. но я ранее успешно реализовал некоторые случаи с OpenLDAP. так что лучше использовать System.DirectoryServices.Protocols
0

Я думаю, что последний параметр ModifyRequest в ctor, который вы используете, ожидает массив объектов, и вы передаете только одно значение, которое, вероятно, вызывает вашу ошибку.

Я бы использовал это вместо строки ModifyRequest

DirectoryAttributeModification modifyUserPassword = new DirectoryAttributeModification();
modifyUserPassword.Operation = DirectoryAttributeOperation.Replace;
modifyUserPassword.Name = "userPassword";
modifyUserPassword.Add(newPassword);

ModifyRequest modifyRequest = new ModifyRequest(user.dnName, modifyUserPassword);
  • 0
    на самом деле, конструктор ModifyRequest принимает «params object [] values», поэтому одно значение преобразуется в массив. Это также, как я использую это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню