SASL - LDAP: код ошибки 49 - 80090303: LdapErr: DSID-0C09054F, комментарий: Digest-uri не соответствует ни одному из имен SPN LDAP, зарегистрированных для этого сервера. - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь обновить пароль пользователя для пользователя в Microsoft Active Directory с LDAP, используя библиотеку JNDI через SASL (DIGEST-MD5) .И есть несколько проблем, которые приводят к сбою операции.

Первый выпуск

На этапе аутентификации я получаю сообщение об ошибке Exception: #javax.naming.AuthenticationException: [LDAP: error code 49 - 80090303: LdapErr: DSID-0C09054F, comment: The digest-uri does not match any LDAP SPN's registered for this server., data 0, v2580

Предпринятые шаги

Я добавил требуемый SPN к контроллеру домена в AD, и проблема была решена только один раз, затем она вернулась.Когда я проверил DC, я обнаружил, что SPN, который я только что добавил, был удален.И это происходит каждый раз, когда я добавляю имя участника-службы в DC!

Второй выпуск

Во время успешной аутентификации сервер отказывается обновлять пользователя.пароль.Я пытаюсь обновить атрибут «unicodePwd» с помощью операции «DirContext.REPLACE_ATTRIBUTE» (для проверки подлинности я использую учетную запись администратора контроллера домена и пытаюсь обновить обычную учетную запись пользователя).

Этоэто ошибка, которую я получаю "Ошибка: #javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000001F: SvcErr: DSID-031A12D2, problem 5003 (WILL_NOT_PERFORM), data 0 ]; remaining name '<the DN of the user that I was trying to update>'

Еще одно замечание, когда я проверяю атрибут" unicodePwd ", он всегда сбрасывается !! Итак, вопрос здесь" Как AD аутентифицирует пользователя?Какой атрибут содержит пароль пользователя? !!

Третий выпуск

Я могу использовать пару клиентов LDAP и обновить / сбросить пароль пользователя.Мне нужно только указать протокол аутентификации как (SASL), и операция пройдет гладко =, без необходимости вносить изменения в AD / SC!

Это пример кода, который я использую

// Session variables
String adminUsername = "<administrator sAMAccountName value>";
String adminPwd = "<admin password>";
String userDN = "<DN for the user being updated>";
String newPwd = "<The new password for the user being updated>";
String ipAddress = "<AD ip address>";

// LDAP configuration
String securityProtocol = "sasl";
String providerURL = "ldap://" + ipAddress;

Hashtable<Object, Object> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put("javax.security.sasl.strength", "high");
env.put("javax.security.sasl.policy.noplaintext", "true");
env.put(Context.PROVIDER_URL, providerURL);
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, adminUsername);
env.put(Context.SECURITY_CREDENTIALS, adminPwd);
env.put(Context.SECURITY_PROTOCOL, securityProtocol); 
env.put(Context.REFERRAL, "follow");

// Prepare the modifications list 
String newQuotedPassword = "\"" + newPwd + "\"";
byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, 
        new BasicAttribute("unicodePwd", newUnicodePassword));

// Initiate the LDAP connection
LdapContext ctx = new InitialLdapContext(env, null);

// Modify the password
ctx.modifyAttributes(userDN, mods);

// Close LDAP connection
ctx.close();

Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 02 ноября 2018

Итак, после большого количества исследований и разработок.Невозможно обновить пароль в AD без использования SSL.Java и MS AD очень строги в этом.

...