【发布时间】: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