UserPrincipal.FindByIdentity Permissions - PullRequest
       7

UserPrincipal.FindByIdentity Permissions

15 голосов
/ 27 августа 2010

Я пытаюсь использовать библиотеку .NET System.DirectoryServices.AccountManagement для получения UserPrincipal для конкретного пользователя Active Directory.

У меня есть следующий код:

PrincipalContext context = new PrincipalContext(ContextType.Domain, "DomainName");
userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);

Этот код выполняется как действительный пользователь домена, но при его выполнении я получаю следующее исключение:

System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Ошибка входа: неизвестное имя пользователя или неверный пароль.

Что интересно, я могу сделать следующий вызов, используя тот же контекст, без проблем:

context.ValidateCredentials(username, password, ContextOptions.Negotiate)

Идеи

Ответы [ 2 ]

12 голосов
/ 01 марта 2011

Вам необходимо использовать конструктор PrincipalContext, который принимает имя пользователя и пароль.

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

3 голосов
/ 02 марта 2011

Похоже, у вас есть сохраненные сетевые учетные данные. В Windows вы можете указать использование других сетевых учетных данных при попытке доступа к сетевым ресурсам. Я могу воспроизвести точно такую ​​же проблему, как вы видите, настроив неверные сетевые учетные данные.

Предполагая, что ваш домен называется yourdomain.com, вы можете указать Windows всегда использовать определенное имя пользователя и пароль, когда он общается с любыми компьютерами с достаточным количеством yourdomain.com.

=== Windows 7/2008 ===

  1. Запустите «Менеджер Crendentail».
  2. В разделе учетных данных Windows нажмите Add a Windows credentials
  3. В сетевом адресе введите *.yourdomain.com
  4. В имени пользователя и пароле введите неверное имя пользователя или пароль

=== Windows XP / 2000/2003 ===

  1. Нажмите Пуск и Выполнить
  2. Введите control keymgr.dll
  3. Нажмите кнопку Добавить в диалоговом окне «Сохраненные имена пользователей и пароли»
  4. В текстовое поле сервера введите *.yourdomain.com
  5. В имени пользователя и пароле введите неверное имя пользователя или неверный пароль

Если это действительно проблема, с которой вы сталкиваетесь, то легко исправить, удалив сохраненные пароли.

Почему работает context.ValidateCredentials (имя пользователя, пароль, ContextOptions.Negotiate)? Это просто потому, что вы инициализируете другую аутентификацию Kerberos / NTLM, поскольку вы снова предоставляете uername и password. Под капотом, если выбран Kerberos, он отправит контроллеру домена предоставленные имя пользователя и пароль и обменяет их на билет Kerberos TGT. Затем ваша машина получит билет на обслуживание на сервере LDAP, используя этот билет TGT. Затем ваша машина отправит этот сервисный билет на сервер LDAP. Обратите внимание, что этот билет службы не будет сохранен в текущем сеансе входа в систему.

Почему UserPrincipal.FindByIdentity не работает? Если у вас нет сохраненного пароля, обычно он должен работать, поскольку Windows просто использует текущий билет TGT пользователя для входа в систему для обмена на билет службы сервера LDAP. Там нет никакого процесса проверки имени пользователя / пароля. Однако, если у вас неверный пароль, Windows может подумать, что не следует использовать текущий билет TGT для входа в систему. Вместо этого он должен получить новый билет TGT, используя сохраненный сетевой пароль. Вот почему вы видите System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.

...