Как использовать учетные данные зарегистрированного пользователя для поиска в Active Directory? - PullRequest
2 голосов
/ 04 марта 2010

У меня есть веб-приложение (.NET 3.5), которое отправляет уведомления по электронной почте пользователям. Для этого я ищу в Active Directory электронную почту каждого человека.

В данный момент я жестко задаю свое имя пользователя и пароль, чтобы выполнить поиск AD:

    Dim entry As New DirectoryEntry("LDAP://companyad", "myUsername", "myPassword", AuthenticationTypes.Secure)
    Dim srch As New DirectorySearcher(entry)
    srch.Filter = [String].Format("(&(objectClass=person)(sAMAccountName={0}))", "someOtherUsername")
    Dim result As SearchResult = srch.FindOne()

Теперь, очевидно, это не идеально, и я не хочу, чтобы эти учетные данные были жестко закодированы. Мое веб-приложение использует проверку подлинности Windows. Он также использует олицетворение (как зарегистрированный пользователь) для доступа к файлам и SQL Server. Есть ли у меня способ «выдать себя за» зарегистрированного пользователя для поиска в AD?

РЕДАКТИРОВАТЬ 1

Я подумал, что лучше объяснить, почему я выбрал этот ответ. Проблема оказалась не в мультискачке или в Kerberos, так как кажется, что я их правильно настроил.

Недавно я изменил свое приложение, чтобы разрешить доступ к определенной группе только через настройки web.config. Раньше я только разрешал доступ к себе. Я создал группу и добавил себя в нее. Затем я удалил жестко закодированные учетные данные и попытался запустить приложение БЕЗ ПЕРЕЗАПУСКА моего компьютера.

По словам моего сетевого администратора, я не войду в эту новую группу, пока не перезапущу свой компьютер, который, по-моему, и был причиной моей проблемы. Итак, ответ Преета на самом деле самый точный, поскольку мне просто нужно было передать путь LDAP в DirectoryEntry.

РЕДАКТИРОВАТЬ 2

Мне также нужно было зарегистрировать имя участника службы.

Я запустил это:

setspn -A HTTP/[dns name of the site] [machine name]

на моей машине для разработки.

Спасибо всем за ответы.

Ответы [ 4 ]

0 голосов
/ 04 марта 2010

Если вы хотите использовать зарегистрированную учетную запись Windows в качестве учетных данных для AD, вы должны использовать следующее:

public bool IsExistingUser() {
    DirectoryEntry de = new DirectoryEntry(Environment.UserDomainName)
    DirectorySearcher ds = new DirectorySearcher(de)
    ds.Filter = string.Format("((objectClass=user)(SAMAccountName={0}))", Environment.UserName)

    try
        SearchResult sr = ds.FindOne();
        if (sr != null && sr.DirectoryEntry.Name.Contains(Environment.UserName))
            return true;
    catch (DirectoryServicesCOMException ex)
    catch (COMException ex)
        throw new Exception("Can't find logged in user in AD", ex);

    return false;
}

Если этот код будет скомпилирован и запущен, он проверит, известен ли существующий вошедший в систему пользователь вашему контроллеру домена.

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

РЕДАКТИРОВАТЬ Вот довольно полезная ссылка для AD: Howto: (почти) все в Active Directory через C # Я нашел этот пост потрясающим!

0 голосов
/ 04 марта 2010

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

0 голосов
/ 04 марта 2010

Я установил в своем файле web.config и добавил следующий код в обработчик событий загрузки моей страницы. Работало нормально. Вы уверены, что не имеете дело с ситуацией с несколькими прыжками? В этом случае ваша учетная запись пула приложений должна быть настроена для аутентификации kerberos, чтобы поддерживать олицетворение в сценарии с несколькими переходами. Больше информации об этом здесь: http://support.microsoft.com/kb/329986

Response.Write(User.Identity.Name);
DirectoryEntry entry = new DirectoryEntry("LDAP://[mydomain.net]");
DirectorySearcher srch  = new DirectorySearcher(entry);
srch.Filter = string.Format("(&(objectClass=person)(sAMAccountName={0}))", "[user]");
SearchResult result = srch.FindOne();
Response.Write(result.Path);
0 голосов
/ 04 марта 2010

не

Dim entry As New DirectoryEntry("LDAP://companyad")

работа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...