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