Доступ к Active Directory в ASP.NET?

Я использую консольное приложение для написания тестового кода:

    /// <summary>
    /// Returns AD information for a specified userID.
    /// </summary>
    /// <param name="ntID"></param>
    /// <returns></returns>
    public ADUser GetUser(string ntID)
    {            
        DirectorySearcher search = new DirectorySearcher();         
        search.Filter = String.Format("(cn={0})", ntID);
        
        search.PropertiesToLoad.Add("mail");
        search.PropertiesToLoad.Add("givenName");
        search.PropertiesToLoad.Add("sn");
        search.PropertiesToLoad.Add("displayName");
        search.PropertiesToLoad.Add("userPrincipalName");            
        search.PropertiesToLoad.Add("cn");

        SearchResult result = search.FindOne();

        return new ADUser(result);
    }

И это отлично работало из консольного приложения. Однако, когда я переместил его в приложение ASP.NET, я получил сообщение об ошибке о том, что не знаю правильный домен.

Есть ли трюк, который мне не хватает для доступа к AD при работе с учетной записью ASPNET?

EDIT: передачи только строки подключения LDAP://domain недостаточно, так как требуется фактический логин/пароль. Поскольку это выполняется под локальной учетной записью на машине, я не уверен, какой AD L/P использовать. Могу ли я каким-то образом делегировать доступ к учетной записи пользователя этому?

EDIT #2: при попытке использовать олицетворение личности я получаю исключение DirectoryServicesCOMException с:

Механизм аутентификации неизвестен.


person FlySwat    schedule 08.12.2008    source источник


Ответы (5)


Да. Вам нужно указать строку подключения к каталогу. Консольное приложение (работающее от вашего имени) запускается с вашими учетными данными, включая доступ к каталогу. Приложение ASP.NET запускается с учетными данными пользователя ASPNET, которые являются локальными для системы, в которой выполняется приложение, а не глобальными для каталога.

person TheSmurf    schedule 08.12.2008

Если это приложение для интрасети, использующее проверку подлинности Windows, вы можете обернуть вызов AD в контексте олицетворения пользователя.

Что-то вроде:

using (((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate())
{
    // Do your AD stuff here
}
person Tom Jelen    schedule 08.12.2008
comment
Это вызывается из библиотеки, а не страницы, так как мне получить доступ к пользователю? - person FlySwat; 08.12.2008
comment
У меня нет визуальной студии рядом со мной, чтобы проверить это. Но если мне не изменяет память, то System.Threading.Thread.CurrentPrincipal.Identity должен содержать точно такой же Identity. - person Tom Jelen; 08.12.2008
comment
Изменить № 2 заставляет меня думать, что System.Threading.Thread.CurrentPrincipal.Identity.Name не содержит ожидаемого домена\имя пользователя, это правильно? - person Tom Jelen; 08.12.2008
comment
На самом деле я не могу преобразовать System.Thrading.Thread.CurrentPrincipal.Identity в WindowsIdentity. Я просто пытался использовать impersonate=true в web.config. - person FlySwat; 09.12.2008
comment
Ах хорошо. Похоже, вы не включили аутентификацию Windows для веб-приложения в IIS. Если он горит, то у меня нет идей. - person Tom Jelen; 09.12.2008
comment
Это потому, что делегирование не включено. Я попытался описать процесс в своем ответе, если вы хотите получить более подробную информацию, обновите свой вопрос, и я сделаю все возможное. - person pipTheGeek; 10.12.2008

В качестве альтернативы вы можете указать идентификатор impersonate=true в файле web.config, и запрос к Active Directory будет отправлен как вызывающий пользователь, а не как Machine\ASPNET.

Редактировать: если вы получаете ошибку аутентификации, см. сообщение PIPTHEGEEK, вам придется доверять вашему веб-серверу для делегирования, однако будьте осторожны с доверием для делегирования (поскольку он открывает еще одну банку червей для типов безопасности). Вы должны разрешить веб-серверу передавать учетные данные текущего пользователя в AD.

Если возможно, перейдите в свойства AD для компьютера, выберите вкладку делегирования и выберите «Доверять этому компьютеру для делегирования любой службе (только Kerberos)».

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

"Доверять этому компьютеру делегирование только указанным службам"

Затем выберите «Использовать только Kerberos».

и в «службах, которым эта учетная запись может предоставлять делегированные учетные данные» добавьте соответствующую информацию о службе.

person Ta01    schedule 08.12.2008

Самый простой способ обойти это — запустить пул веб-приложений в качестве учетной записи домена с необходимым доступом. Это избавляет вас от необходимости управлять безопасным хранением пароля. Не забудьте сделать учетную запись членом локальной группы IIS_WPG. Если вы решите использовать олицетворение, вам придется настроить делегирование Kerberos, а также изменить конфигурацию ASP.NET для олицетворения. Это потребует запуска пула приложений в качестве учетной записи домена, предоставления этой учетной записи домена разрешения на делегирование учетных данных (вкладка делегирования свойств учетной записи в AD пользователей и компьютеров MMC). Затем убедитесь, что веб-сайт настроен на использование согласования в метабазе (это значение по умолчанию в IIS6, не уверен в других версиях), и зарегистрируйте имя участника-службы для новой учетной записи домена.

Изменить: ваша ошибка «Неизвестная аутентификация» звучит как неправильно настроенное делегирование. Убедитесь, что учетная запись, в которой работает ваш пул приложений, является доверенной для делегирования, что IIS настроен на использование ТОЛЬКО проверки подлинности Windows и что для учетной записи удостоверения пула приложений зарегистрировано действительное имя участника-службы.

person pipTheGeek    schedule 08.12.2008

Вы также можете попробовать включить домен в логин

adSharepointUsers = new DirectoryEntry("LDAP://MyDomain","MyDomain/ADUser","password");
person Mark Hosang    schedule 27.06.2011
comment
Удивительно (для меня), это предложение решило мою проблему. Без домена в логине я получал неизвестную ошибку механизма аутентификации. Добавление домена к имени пользователя исправило это. - person Eric King; 24.06.2013