Я пытаюсь обновить пароль пользователя для пользователя в 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();
Ваша помощь очень ценится.