Подтвердить что ты не робот

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

В настоящее время я пытаюсь выполнить аутентификацию через службы Active Directory с использованием класса PrincipalContext. Я хотел бы, чтобы мое приложение аутентифицировалось в Домене с использованием Sealed и 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 говорит о "контейнере":

Контейнер в хранилище для использования в качестве корень контекста. Все запросы выполняются под этим корнем, и все вставляются эти вставки контейнер. Для домена и Типы контекста приложенияDirectory, этот параметр отличается name (DN) объекта контейнера.

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

4b9b3361

Ответ 1

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

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

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

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

UPDATE:

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

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

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

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

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

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

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

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

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