Службы Active Directory: PrincipalContext - что такое DN объекта "контейнер"?

в настоящее время я пытаюсь аутентифицироваться через службы Active Directory, используя класс PrincipalContext. Я хотел бы, чтобы мое приложение аутентифицировалось в домене с использованием запечатанных и SSL-контекстов. Чтобы сделать это, я должен использовать следующий конструктор PrincipalContext (ссылка на страницу MSDN):

public PrincipalContext(
    ContextType contextType,
    string name,
    string container,
    ContextOptions options
)

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

PrincipalContext domainContext = new PrincipalContext(
    ContextType.Domain, 
    domain, 
    container, 
    ContextOptions.Sealing | ContextOptions.SecureSocketLayer);

MSDN говорит о "контейнере":

контейнер в магазине использовать как корень контекста. Все запросы выполняются под этим корнем, и все вставки выполняются в это контейнер. Для домена и Типы контекста ApplicationDirectory, этот параметр является отличительным имя (DN) объекта-контейнера.

Что такое DN объекта контейнера? Как узнать, что является объектом контейнера? Могу ли я запросить сервер Active Directory (или LDAP) для этого?

1 ответов


Ну, мне удалось выяснить вопрос:

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain);

domainContext.ValidateCredentials(userName, password, 
    ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);

указав ContextOptions в методе ValidateCredentials (вместо конструктора), это позволило мне избежать необходимости указывать DN для объекта контейнера.

обновление:

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

видимо, когда ContextOptions устанавливаются в ValidateCredentials, эти параметры используются только для этого конкретного вызова ValidateCredentials. Но вот что странно...

Итак, я хотел, чтобы мои запросы к серверу объявлений также были зашифрованы. Пример запроса:

UserPrincipal p = UserPrincipal.FindByIdentity(
    domainContext, IdentityType.SamAccountName, userName);
var groups = p.GetGroups();
foreach (GroupPrincipal g in groups) { /* do something */ }

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

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain,
    null,ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);

я обнаружил, что могу установить объект контейнера (DN) в null. И это прекрасно работает. Установка его в пустую строку ( "" ) приводит к исключению неизвестного типа, поэтому не думайте, что вы можете дать ему пустую строку.

и вот что странно. Вы думаете, что установка параметра SecureSocketLayer в PrincipalContext будет означать, что вам не нужно явно устанавливать его при использовании VerifyCredentials. Но я обнаружил, что если я не положу его в Часть VerifyCredentials, аутентификация завершится неудачей, но запросы (как в Примере к группам) по-прежнему будут зашифрованы.

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