Я столкнулся со странной ошибкой при попытке привязки к конкретному DC с помощью класса LdapConnection
. Мне удалось сократить код до следующего:
static void Main(string[] args)
{
var cred = new NetworkCredential("username", "password", "domainFQDN");
try
{
var ldapConnection = new LdapConnection(new LdapDirectoryIdentifier("domain1.test.local", 389, false, false), cred, AuthType.Kerberos);
ldapConnection.Bind();
Console.WriteLine("Connected 1");
}
catch (Exception e)
{
Console.WriteLine(e);
}
try
{
var ldapConnection2 = new LdapConnection(new LdapDirectoryIdentifier("dc1.domain1.test.local", 389, true, false), cred, AuthType.Kerberos);
ldapConnection2.Bind();
Console.WriteLine("Connected 2");
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadLine();
}
Вывод этой программы последовательно:
Connected 1
System.DirectoryServices.Protocols.LdapException: A local error occurred.
at System.DirectoryServices.Protocols.LdapConnection.BindHelper(NetworkCredential newCredential, Boolean needSetCredential)
at System.DirectoryServices.Protocols.LdapConnection.Bind()
Единственная разница между вызовами состоит в том, что в первом соединении я использую полное доменное имя домена в LdapDirectoryIdentifier
, а во втором соединении я использую точный адрес постоянного тока. Конечно, я проверил, что первое соединение идет к тому же DC, что и второе.
Ошибка возникает только тогда, когда я указываю AuthType.Kerberos
для метода аутентификации. Ошибка возникает всегда, когда я пытаюсь подключиться к домену в другом лесу, и только иногда, когда я подключаюсь к контроллеру домена в локальном лесу.
Вероятно, я могу обойти ошибку, дважды используя доменное имя, но тогда я не гарантирую липкость, когда получу соединение с конкретным DC.
Как я могу убедиться, что второе подключение идет к тому же DC, не получая эту ошибку?