我正在尝试诊断客户端站点上运行的服务器应用程序的问题。所述应用程序针对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特定问题的地方。
答案 0 :(得分:0)
事实证明这不是代码问题,而是客户的AD环境存在Kerberos问题。
特别是安全/密封标志指示LDAP提供程序仅使用Kerberos安全地协商身份验证。
由于WinNT提供程序不支持Kerberos,因此不存在与WinNT提供程序绑定的问题。