Сервер LDAP недоступен с использованием PrincipalContext и ADLDS

Мы используем 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

person Scott    schedule 10.05.2017    source источник


Ответы (1)


Вы пытались использовать консоль управления Microsoft для импорта сертификата?

Два способа установки сертификата

Либо

  1. Откройте консоль cmd.exe и введите «MMC».
  2. Файл > Добавить/удалить оснастку...
  3. Выберите Сертификаты, нажмите Добавить
  4. При появлении запроса выберите «Учетная запись компьютера» и «Локальный компьютер», затем «ОК»...
  5. Сертификаты теперь должны отображаться в корне консоли.
  6. Сертификаты > Доверенные корневые центры сертификации > Сертификаты > (щелчок правой кнопкой мыши) > Все задачи > Импорт сертификата...
  7. Найдите сертификат, который хотите импортировать, нажмите «Далее» и выберите значения по умолчанию (Доверенные корневые центры сертификации уже должны быть выбраны).
  8. Нажмите Далее, Готово

(or)

Просто дважды щелкните файл .cer для сертификата в проводнике Windows, нажмите «Установить сертификат...» > «Далее» > выберите параметр «Поместить все сертификаты в следующее хранилище» > «Обзор» > «Выбрать доверенные корневые центры сертификации». Продолжайте со следующим, пока не закончите.


На этом этапе ваш сертификат установлен, и вы сможете безопасно обмениваться данными с сервером ADLDS.

person Mindwalker2076    schedule 10.05.2017
comment
Спасибо @Mindwalker2076, у меня это работает. Я предполагаю, что мне придется делать это на каждой машине, которой потребуется доступ к серверу AD LDS с использованием кода .NET? - person Scott; 10.05.2017