Как я могу сохранить учетные данные соединения между вызовами в System.DirectoryServices? - PullRequest
0 голосов
/ 09 февраля 2011

Я пытаюсь подключиться к домену Active Directory (W2K8R2 DC) в другом лесу.Для этого я передаю учетные данные в следующий конструктор DirectoryEntry:

DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType)

Это все хорошо и хорошо.Что бы я хотел бы сделать, хотя бы каким-то образом сохранить соединение и повторно использовать его во всех моих вызовах в AD, чтобы мне не нужно было повторно передавать учетные данные.Это как-то возможно?

Спасибо!

1 Ответ

4 голосов
/ 10 февраля 2011

Если вам нужен элемент управления на уровне соединения, я рекомендую вам использовать System.DirectoryServices.Protocol . Вы можете повторно использовать ваше соединение LDAP для выполнения разных запросов LDAP. Однако парадигма программирования очень отличается от DirectoryEntry

Если вам нужно использовать DirectoryEntry, вам нужно где-то сохранить имя пользователя и пароль, а затем передать их всем DirectoryEntry объектам. Я хотел бы написать метод GetDirectoryEntry(string dn) и создать для него метод DirectoryEntry с правильным именем пользователя и паролем. Это не выглядит элегантно, но не делает ничего плохого. Если вам важно, чтобы пароль сохранялся в памяти в виде простого текста, используйте SecureString для хранения пароля.

В этом нет ничего плохого, потому что DirectoryEntry поддерживает свой собственный пул соединений LDAP. Если у вас несколько DirectoryEntry с одним и тем же именем пользователя и паролем, он будет достаточно умен для совместного использования соединения LDAP. По сути, это то же самое, что удерживать одно соединение LDAP и выполнять разные запросы LDAP. Он не будет проходить повторную аутентификацию на сервере LDAP для каждого из DirectoryEntry объектов

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

static DirectoryEntry GetObject(DirectoryEntry root, string dn)
{
    using (DirectorySearcher searcher = new DirectorySearcher(root))
    {
        searcher.Filter = "(distinguishedName=" + dn + ")";
        searcher.SearchScope = SearchScope.Subtree;
        SearchResult result = searcher.FindOne();
        if (result == null) return null;
        return result.GetDirectoryEntry();
    }
}

Вам просто нужно привязать к корневому объекту имя пользователя и пароль. Затем вы можете сохранить корневой объект как статическую переменную или что угодно. Затем вы получаете другой объект DirectoryEntry, выполняя запрос LDAP с SearchRoot, установленным в ваш корневой объект. Возвращенный DirectoryEntry будет по-прежнему использовать имя пользователя и пароль от пользователя root. Опять же, это не делает ничего лучше, чем просто ввод имени пользователя и пароля в DirectoryEntry. Действительно, с точки зрения производительности, это хуже, потому что нам нужно сделать еще один запрос LDAP, чтобы получить DirectoryEntry

...