Службы 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, но это кажется мне странным поведением.