尝试使用LdapConnection
类绑定到特定DC时遇到了一个奇怪的错误。我设法将代码删除到以下内容:
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
中的域FQDN,而在第二个连接中,我使用确切的DC地址。当然,我确认第一个连接与第二个连接到同一个DC。
仅当我为身份验证方法指定AuthType.Kerberos
时才会出现此错误。当我尝试连接到不同林中的域时,总是会发生错误,有时仅当我连接到本地林中的DC时才会发生错误。
我可以通过两次使用域名来解决错误,但是一旦我获得与特定DC的连接,我就无法确保粘性。
如何在不收到此错误的情况下确保第二个连接转到同一个DC?
答案 0 :(得分:0)
只有在我为身份验证方法指定AuthType.Kerberos时才会出现错误。
您的问题是Kerberos身份验证。
从命令行尝试(使用DC的短名称,而不是FQDN):
setspn dc1
该列表中应该有一堆,但我认为这里的问题是“ldap / dc1.domain1.test.local / domain1.test.local”。你在列表中看到了吗?
如果没有,您可以添加它。作为域管理员,请从命令行使用此命令:
setspn -a ldap/dc1.domain1.test.local/domain1.test.local dc1
此处有更多详细信息,虽然在该文章中讨论的丢失的SPN是具有GUID的SPN。底部的列表显示了SPN列表的外观:https://support.microsoft.com/en-ca/help/308111/a-missing-service-principal-name-may-prevent-domain-controllers-from-r
如果已列出该SPN,则可以按照此处的说明开启Kerberos日志记录:https://support.microsoft.com/en-ca/help/262177/how-to-enable-kerberos-event-logging
启用日志记录后,Kerberos错误将显示在系统事件日志中。它会让你更好地了解它失败的原因。