Как разрешить ответ WILL_NOT_PERFORM MS AD при попытке изменить пароль в scala с несвязанным LDAP SDK?

Я борюсь с Active Directory, пытаюсь заставить меня изменить пароль. Я нашел массу полезной информации, но все равно получаю постоянную ошибку.

Некоторый код:

import com.unboundid.ldap.sdk._
import com.unboundid.util.ssl._


def main(args: Array[String]) : Unit = {

var sslUtil = new SSLUtil( new TrustAllTrustManager() )
var con = new LDAPConnection(sslUtil.createSSLSocketFactory())
con.connect("ldap.example.net", 636)
con.bind("ldapadmin", "adminpasswd")
val newPass = "Jfi8ZH8#k".getBytes("UTF-16LE");
val modRequest = new ModifyRequest("dn: cn=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net",
  "changetype: modify",
  "replace: unicodePwd",
  "unicodePwd: " + '"' + newPass + '"')

println("\nGoing to try to set password to " + newPass + " with: " + modRequest.toString())

try {
  con.modify(modRequest)
} catch {
  case lde:LDAPException => println("failed LDAPException: " + lde.toString())
}

}

Итак, я получаю это как ошибку времени выполнения:

Собираюсь попытаться установить пароль на [B @ 6dd1627e с помощью: ModifyRequest (dn = 'cn = Tester Dude, ou = Lab, ou = Org, ou = Provider, DC = example, DC = net', mods = {REPLACE unicodePwd} )

сбой LDAPException: LDAPException (resultCode = 53 (не желает выполнять), errorMessage = '0000001F: SvcErr: DSID-031A11E5, проблема 5003 (WILL_NOT_PERFORM), данные 0', DiagnosticMessage = '0000001F: SvcErr: DSID-031A11EORM5 (проблема) ), данные 0 ')

Итак, среди вещей, которые я знаю, может вызвать эту ошибку:

  1. Не подключается через SSL. (Здесь не тот случай, и я проверил, что на 100% уверен, что нахожусь на порту 636, используя netstat)
  2. Передача пароля, нарушающего политику паролей Active Directory. (Я тестировал установку этого точного пароля вручную; он отклоняет короткие / простые пароли, но принимает тот, который я использую в этом коде)

Я пробовал как с лишними кавычками вокруг пароля, так и без них.

Самыми полезными источниками информации до сих пор были:

http://www.dirmgr.com/blog/2010/8/26/ldap-password-changes-in-active-directory.html.

Но я исчерпал все предложения там (и во многих других местах).

Я также пробовал несколько других вещей, включая установку пароля для другого действительного пользователя, который был добавлен вручную. (Этот также был добавлен через SDK.)

Остальные операции работают нормально. Я удалил ненужный код, но смог без проблем искать, печатать атрибуты, добавлять и удалять пользователя; но этот запрос на изменение не выполняется. Если я установлю ModifyRequest для изменения какого-либо другого атрибута, такого как связанный адрес электронной почты, это также будет работать нормально.


person mattwallace    schedule 23.07.2011    source источник


Ответы (4)


соединение недостаточно безопасно

Цитата из: http://support.microsoft.com/kb/269190

Чтобы изменить этот атрибут, клиент должен иметь 128-битное соединение Secure Socket Layer (SSL) с сервером.

Таким образом, даже если все остальное выглядит правильно, вы все равно можете получить SvcErr: DSID-03190F4C, problem 5003 (WILL_NOT_PERFORM), если соединение будет сочтено небезопасным.

отсутствие прав администратора

Запрос на изменение может завершиться ошибкой, если вы попытаетесь выполнить replace без недостаточных прав.

dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
replace: unicodePwd
unicodePwd:: base64(utf16le(quoted(password)))
-

В этом случае вы получите SecErr: DSID-03150E47, problem 4003 (INSUFF_ACCESS_RIGHTS). Это произойдет, если вы попытаетесь bind использовать непривилегированную учетную запись.

история паролей

Некоторым администраторам нравится иметь длинную историю паролей (например, сохранены последние 24 пароля). Вы получите CONSTRAINT_ATT_TYPE, если используете старый пароль, который уже внесен в историю.

постоянный пользователь

  1. обезопасить соединение

  2. используйте комбинацию _7 _-_ 8_.

e.g.

dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
delete: unicodePwd
unicodePwd:: base64(utf16le(quoted(old password)))
-
add: unicodePwd
unicodePwd:: base64(utf16le(quoted(new password)))
-
person dnozay    schedule 05.08.2014

Оказывается, он должен быть закодирован в UTF-16LE, а затем преобразован в base64.

val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary(('"'+"Jfi8ZH8#k"+'"').getBytes("UTF-16LE"))

Сделал свое дело.

person mattwallace    schedule 23.07.2011

Я предполагаю, что "unicodePwd: " + '"' + newPass + '"' обходит вашу кодировку (поскольку String нужно снова преобразовать в байты, и я уверен, что он не использует правильную кодировку).

Попробуйте использовать версию MofifyRequest, которая принимает Modification объектов, а затем используйте конструктор, который принимает значение атрибутов в виде байтов.

val newPass = "\"Jfi8ZH8#k\"".getBytes("UTF-16LE")
// note the dquotes inside the string

val mod = new Modification(ModificationType.REPLACE, "unicodePwd", newPass)

точно так же, как в сообщении в блоге, на которое вы указали ...

person huynhjl    schedule 23.07.2011
comment
Оказывается, он должен быть закодирован в UTF-16LE, а затем преобразован в base64. val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary (('' + Jfi8ZH8 # k + ''). getBytes (UTF-16LE)) Получилось. Отправлю это как ответ, когда сможет. - person mattwallace; 23.07.2011

Я тоже наткнулся на эту проблему. Я использую библиотеку Novell.Directory.Ldap.NETStandard для C #. В моем случае проблема заключалась в том, что пароль нужно указывать. Этот код работал у меня:

var passwordBytes = Encoding.Unicode.GetBytes($"\"{newPassword}\"");
connection.Modify(userDn, new LdapModification(LdapModification.Replace, new LdapAttribute("unicodePwd", passwordBytes)));
person Rytis I    schedule 11.12.2020