Ошибка смены пароля в активной директории - PullRequest
0 голосов
/ 25 апреля 2019

В настоящее время я разрабатываю приложение с весенней загрузкой. Пользователь для этого приложения читаются из MS Active Directory. Хотя чтение всех пользователей из AD и проверка подлинности через Spring Boot Security Configuration работают нормально, у меня возникли некоторые проблемы при изменении пароля пользователя.

Я не хочу, чтобы пользователи моего приложения входили в мой контроллер домена, чтобы изменить свои начальные пароли. Так что это должно быть возможно через само приложение. В настоящее время я пытался использовать приведенный ниже код, но я получаю исключение при попытке:

Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). [LDAP: код ошибки 50 - 00002098: SecErr: DSID-03150F93, проблема 4003 (INSUFF_ACCESS_RIGHTS), данные 0]; вложенным исключением является javax.naming.NoPermissionException: [LDAP: код ошибки 50 - 00002098: SecErr: DSID-03150F93, проблема 4003 (INSUFF_ACCESS_RIGHTS), данные 0]; оставшееся имя 'cn = тестирующий пользователь'

public void changeUserPassword(String username, String oldPassword, String newPassword) {
    byte[] encodedNewPassword = encode(newPassword);
    ModificationItem[] mods = new ModificationItem[1];
    mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("UnicodePwd", encodedNewPassword));

String base = "OU=someOtherOU,OU=someOu,DC=domain,DC=dom";
String userCN = "CN="+username;
String userDN = userCN + "," + base;
    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl("ldap://my-domain.com:389");
    contextSource.setBase(base);
    contextSource.setUserDn(userDN);
    contextSource.setPassword(oldPassword);
    contextSource.afterPropertiesSet();

    LdapTemplate ldapTemplate = new LdapTemplate(contextSource);

    ldapTemplate.modifyAttributes(UserCN, mods);
}

private byte[] encode(String password) {
    String quotedPassword = "\"" + password + "\"";
    char[] unicodePassword = quotedPassword.toCharArray();
    byte[] passwordArray = new byte[unicodePassword.length * 2];
    for (int i = 0; i < unicodePassword.length; i++) {
        passwordArray[i * 2 + 1] = (byte) (unicodePassword[i] >>> 8);
        passwordArray[i * 2] = (byte) (unicodePassword[i] & 0xff);
    }
    return passwordArray;
}

Этот код приведет к ошибке, которую я уже опубликовал. Поскольку у меня мало опыта использования протоколла ldap и активного каталога, я не знаю, что я делаю здесь неправильно.

Есть ли ошибка в моем коде? Или это указывает на некоторую неправильную конфигурацию в активном каталоге? (Я использовал значения по умолчанию для мастера создания нового пользователя в средстве управления Active Directory) - например: Должен ли я предоставить некоторые специальные разрешения пользователю?

Некоторая помощь была бы очень хороша.

1 Ответ

0 голосов
/ 26 апреля 2019

AD требуется зашифрованное соединение LDAPS при изменении unicodePassword. Если вы еще не настроили LDAPS в AD, вам может помочь следующий URL.

https://blogs.msdn.microsoft.com/microsoftrservertigerteam/2017/04/10/step-by-step-guide-to-setup-ldaps-on-windows-server/

...