Можно ли получить данные из Active Directory, выдав себя за пользователя, прошедшего проверку подлинности Windows, в ASP.NET? - PullRequest
5 голосов
/ 16 июля 2011

Я пытался решить эту проблему весь день и прочитал противоречивую информацию в стандартных ответах доски объявлений Google.

Я пытаюсь получить адрес электронной почты пользователя домена (то есть текущего пользователя, вошедшего в систему) из активного каталога. Мой сайт ASP.NET 4 настроен для проверки подлинности Windows, и все работает нормально, пока не вызовет активный каталог.

Когда я делаю следующее, я получаю исключение COMEx в строке search.findAll (). Сообщение об исключении: «Произошла ошибка операции» (очень полезное сообщение, а?) (Сокращенный код для удобства чтения)

WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext wic = null;

wic = winId.Impersonate();
using (DirectoryEntry root = new DirectoryEntry(rootQuery))
{
      String userQuery = GetUserQuery();
      DirectorySearcher searcher = new DirectorySearcher(root);
      searcher.SearchScope = SearchScope.Subtree;
      searcher.Filter = userQuery;

      SearchResultCollection results = searcher.FindAll();
      return (results[0].Properties["proxyaddresses"][0]).ToString();
}

Итак, я хочу выдать себя за зарегистрированного пользователя, чтобы сделать звонок. Обратите внимание, что этот код работает должным образом, если я передаю свои учетные данные непосредственно конструктору DirectoryEntry. Кроме того, я получаю ту же ошибку, если избавляюсь от кода олицетворения и задаю олицетворение всего приложения в веб-конфигурации.

Так что я думаю, мой вопрос, прежде чем я потрачу на это больше времени, возможно ли это? Или у вас есть для указания имени пользователя и пароля для доступа к AD?

Кстати, на моем компьютере разработчика я использую IIS5, но, вероятно, развернуюсь на IIS6.

редактирование:

по запросу:

rootQuery = @"LDAP://{0}.com/DC={0}, DC=com";
userQuery = @"(&(samAccountName={0})(objectCategory=person)(objectClass=user))";

с соответствующим доменом и указанным пользователем.

Ответы [ 5 ]

5 голосов
/ 18 июля 2011

Вы пытаетесь олицетворять пользователя для доступа к внешнему ресурсу (внешнее значение не на том же сервере). Вы МОЖЕТЕ сделать это, но вам нужно будет настроить делегирование в активном каталоге, чтобы сервер IIS (или ваш WindowsXP-бокс на данный момент) был доверенным для делегирования. Посмотрите некоторые из этих ресурсов, чтобы начать, если это направление, в котором вы хотите идти.

В качестве альтернативы, чтобы избежать проблем с настройкой и настройкой делегирования должным образом, я просто создаю учетную запись службы в активном каталоге и использую ее вместо этого. Вы можете использовать учетные данные в своем коде, как вы сказали ранее, или использовать элемент Impersonation в web.config для олицетворения этой учетной записи службы: <identity impersonate="true" userName="DOMAIN\ServiceAccount" password="password"/>.

2 голосов
/ 19 июля 2011

Как упоминает @Patricker, вы должны разрешить делегирование для поддержки этого сценария. Также убедитесь, что вы используете механизм аутентификации, который поддерживает делегирование. Если вы используете Kerberos для аутентификации пользователя на веб-сервере, делегирование возможно, но не с NTLM [ 1 ]. При использовании базовой аутентификации делегирование также возможно (так как веб-сервер имеет доступ к имени пользователя и паролю клиента).

1 голос
/ 18 июля 2011
1 голос
/ 18 июля 2011

Если я правильно помню, здесь были некоторые проблемы, если пул приложений работал как Сетевая служба против учетной записи домена.Как настроено ваше?

Кроме того, вы можете опубликовать значение rootQuery и результирующее значение для userQuery?

0 голосов
/ 06 декабря 2012

Также заметил, что в коде поиск LDAP выглядит очень дорого по производительности. Возможно, вы захотите запросить LDAP с помощью sid-поиска, который можно найти в прикрепленной ссылке

...