Ну, мне удалось выяснить вопрос:
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain);
domainContext.ValidateCredentials(userName, password,
ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
Указав ContextOptions в методе ValidateCredentials (а не в конструкторе), это позволило мне избежать необходимости указывать DN для объекта контейнера.
UPDATE:
Хотя я должен пояснить, что после дальнейших экспериментов я обнаружил, что любые запросы, полученные из этого объекта PrincipalContext, выполняются в зашифрованном виде.
Очевидно, что когда 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, но мне это кажется странным.