故障排除帮助:Active Directory绑定失败

时间:2010-06-30 17:50:46

标签: c# active-directory bind directoryservices

我正在尝试诊断客户端站点上运行的服务器应用程序的问题。所述应用程序针对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之外,没有太多代码。

生成的日志文件是(名称和域掩码)。

  

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

     

6/29/2010 2:52:17 PM:Stack:at   System.DirectoryServices.DirectoryEntry.Bind(布尔   throwIfFail)   System.DirectoryServices.DirectoryEntry.Bind()   在   System.DirectoryServices.DirectoryEntry.get_NativeObject()   在   AdmitOne.Superglue.ActiveDirectoryHelper.DoLDAPBind(字符串   domain,String login,String password)   在   C:\项目\加拉帕戈斯\分支\合同\ 2.0_SN_Peer的\ src \工具\强力胶\ ActiveDirectoryHelper.cs:行   47 6/29/2010 2:52:17 PM:开始   WinNT绑定到xxx.xxx 6/29/2010   下午2:52:17:创建DirectoryEntry   域上user1的对象   WinNT://xxx.xxx 6/29/2010 2:52:18 PM:   WinNT绑定成功

因此,使用LDAP无法绑定相同的用户名,但使用WinNT成功!

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

所以我被困住了。我想说这是他们的AD环境的一个问题,但没有吸烟枪,我不能。

我首先在Stack上询问,以确保我的绑定代码是正确的。之后,我可能需要重新使用Serverfault,这是一个更适合询问AD特定问题的地方。

1 个答案:

答案 0 :(得分:0)

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

特别是安全/密封标志指示LDAP提供程序仅使用Kerberos安全地协商身份验证。

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