Мы используем ADLDS для управления пользователями и аутентификации. Мы можем успешно запросить экземпляр без проблем. Однако попытка выполнить такую операцию, как SetPassword
, потерпит неудачу, или даже попытка создать нового пользователя, если пароль не установлен, потерпит неудачу. Я могу успешно обновить пользователя, если это не пароль, который я пытаюсь обновить. Я читал много разных статей, касающихся этого, но не нашел решения. Публикация, чтобы увидеть, могу ли я получить свежий взгляд на эту проблему, спасибо за любой вклад.
ПРИМЕР
ContextType ctxType = ContextType.ApplicationDirectory;
string server = "myadldsserver.com";
string usersCN = "CN=Users,..."; // container where users reside
ContextOptions ctxOpts = ContextOptions.SimpleBind;
string uname = "myuser";
string pswrd = "mypass";
using(var ctx = new PrincipalContext(ctxType, server, usersCN, ctxOpts, uname, pswrd)
using(var newUser = new UserPrincipal(ctx)) {
newUser.Name = "newusername";
newUser.Enabled = true;
newUser.UserPrincipalName = "newusername";
newUser.Save();
newUser.SetPassword("newuserpassword");
}
ОШИБКА 1
Первая проблема, с которой я сталкиваюсь, если я пытаюсь создать новый UserPrincipal и вызывать Save без установки пароля, как в приведенном выше примере, я получаю исключение A constraint violation occurred.
с сообщением расширения InnerException 0000052D: AtrErr: DSID-033807D7, #1:0: 0000052D: DSID-033807D7, problem 1005 (CONSTRAINT_ATT_TYPE), data 2246, Att 9005a (unicodePwd)
Из-за этой ошибки я попытался переместить SetPassword перед вызовом Save вместе с другими подходами, которые я нашел в Интернете, такими как получение DirectoryEntry от UserPrincipal и попытка вызвать SetPassword, но получил другую ошибку.
ОШИБКА 2
Вызов SetPassword перед вызовом UserPrincipal.Save при вызове сохранения приводит к ошибке The directory property cannot be found in the cache.
Обратите внимание, что та же ошибка произойдет, если я попытаюсь вызвать ResetPassword
или получить DirectoryEntry и также вызвать Invoke("SetPassword"...
ОШИБКА 3
Судя по моим исследованиям, большинство из них указывают на то, что это может быть связано с необходимостью доступа к AD LDS с использованием защищенного соединения. Итак, я изменил свой сервер, чтобы включить порт 636 string server = "myadldsserver.com:636"
, и я изменил ContextOptions на ContextOptions.SimpleBind | ContextOptions.SecureSocketLayer
.
Внося эти изменения при создании PrincipalContext, я получаю следующее исключение The server could not be contacted.
с внутренним исключением The LDAP server is unavailable.
, HResult -2146233087
JAVA и LDP
Чтобы добавить к этому некоторую предысторию, у нас есть аналогичный код, написанный в более старом приложении Java. Мы пытаемся перенести часть этой логики на сторону .NET в C#. Код на Java использует хранилище ключей Java, содержащее сертификат, созданный на сервере AD LDS. Приложение Java, конечно же, не имеет проблем с использованием порта SSL. Мы знаем, что сервер настроен правильно, вопрос только в том, как получить к нему доступ со стороны .NET.
Есть ли аналог на стороне .NET, такой как keystore в Java? Мы знаем, что к серверу можно установить SSL-соединение. Мы также проверили это с помощью LDP.
ЦЕЛИ
- Возможность создать нового пользователя и установить его пароль при создании
- Иметь возможность ResetPassword или ChangePassword для пользователя
- Безопасное подключение к нашему экземпляру AD LDS из .NET