【问题标题】:Trouble Shooting Help: Active Directory Bind Fails故障排除帮助:Active Directory 绑定失败
【发布时间】:2023-06-04 10:01:01
【问题描述】:

我正在尝试诊断客户端站点上运行的服务器应用程序的问题。所述应用程序针对 AD 环境中的域控制器验证用户凭据。我们看到的行为是定期没有用户可以通过服务器进行身份验证。

我们基本上已经将失败追溯到“绑定”失败。为了进一步诊断问题,我构建了一个超级简单的工具,它执行两种类型的绑定:一种使用 LDAP 服务器绑定,另一种使用 WinNT 绑定。我们的服务器应用程序只进行 LDAP 绑定,但为了添加控件,我投入了 WinNT 绑定。

        public static void DoWinNTBind(string domain, string login, string password)
        {
            Logger.Log("Starting WinNT Bind to {0}",domain);
            try
            {
                var serverPath = String.Format("WinNT://{0}",domain);

                Logger.Log("Creating DirectoryEntry object for {0} on domain {1}", login, serverPath);
                using (DirectoryEntry de = new DirectoryEntry(serverPath, login, password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing))
                {

                    if (!de.NativeObject.Equals(null))
                    {
                        Logger.Log("WinNT Bind Success");
                    }
                    else
                    {
                        Logger.Log("WinNT Bind Failed");
                    }
                }
            }
            catch(Exception ex)
            {
                Logger.Log("{0} occured during WinNT Bind: {1}",ex.GetType().Name,ex.Message);
                Logger.Log("Stack: {0}",ex.StackTrace);
            }
        }

        public static void DoLDAPBind(string domain,string login, string password) 
        {
            Logger.Log("Starting LDAP Bind to {0}",domain);
            try
            {
                var serverPath = String.Format("LDAP://{0}",domain);

                Logger.Log("Creating DirectoryEntry object for {0} on domain {1}", login, serverPath);
                using (DirectoryEntry de = new DirectoryEntry(serverPath, login, password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing))
                {

                    if (!de.NativeObject.Equals(null))
                    {
                        Logger.Log("LDAP Bind Success");
                    }
                    else
                    {
                        Logger.Log("LDAP Bind Failed");
                    }
                }
            }
            catch(Exception ex)
            {
                Logger.Log("{0} occured during LDAP Bind: {1}",ex.GetType().Name,ex.Message);
                Logger.Log("Stack: {0}",ex.StackTrace);
            }
        }

如您所见,除了使用 System.DirectoryServices.DirectoryEntry 连接 DC 之外,没有太多代码。

生成的日志文件是(名称和域被屏蔽)。

2010 年 6 月 29 日下午 2:52:17:执行广告 为 user1 绑定 2010 年 6 月 29 日下午 2:52:17: 启动 LDAP 绑定到 xxx.xxx 2010 年 6 月 29 日下午 2:52:17:创建 域上的 DirectoryEntry 对象 LDAP://xxx.xxx 2010 年 6 月 29 日下午 2:52:17: 发生 DirectoryServicesCOMException 在 LDAP 绑定期间:登录失败: 未知用户名或错误密码。

2010 年 6 月 29 日下午 2:52:17:堆栈:在 System.DirectoryServices.DirectoryEntry.Bind(布尔值 throwIfFail) 在 System.DirectoryServices.DirectoryEntry.Bind() 在 System.DirectoryServices.DirectoryEntry.get_NativeObject() 在 AdmitOne.Superglue.ActiveDirectoryHelper.DoLDAPBind(字符串 域,字符串登录,字符串密码) 在 C:\Projects\Galapagos\branches\Contract\2.0_SN_Peer\Src\Tools\Superglue\ActiveDirectoryHelper.cs:line 47 2010 年 6 月 29 日下午 2:52:17:开始 WinNT 绑定到 xxx.xxx 6/29/2010 下午 2:52:17:创建 DirectoryEntry 域上 user1 的对象 WinNT://xxx.xxx 2010 年 6 月 29 日下午 2:52:18: WinNT绑定成功

所以相同的用户名使用LDAP绑定失败,但使用WinNT成功!

在我们的本地测试环境中,我们看不到这种行为,LDAP 和 WinNT 都成功且没有问题。

所以我被困住了。我想说这是他们的广告环境的问题,但没有确凿证据,我不能。

我首先询问堆栈,以确保我的绑定代码是正确的。之后,我可能需要重新询问 Serverfault,这是询问 AD 特定问题的更合适的地方。

【问题讨论】:

    标签: c# active-directory bind directoryservices


    【解决方案1】:

    事实证明,这不是代码问题,而是客户的 AD 环境存在 Kerberos 问题。

    具体来说,安全/密封标志指示 LDAP 提供程序仅使用 Kerberos 来安全地协商身份验证。

    由于 WinNT 提供程序不支持 Kerberos,因此与 WinNT 提供程序绑定没有问题。

    【讨论】: