Visual c++ PrincipalContext::ValidateCredentials使用无效密码引发LdapException

Visual c++ PrincipalContext::ValidateCredentials使用无效密码引发LdapException,visual-c++,active-directory,.net-4.0,.net-3.5,Visual C++,Active Directory,.net 4.0,.net 3.5,我有一个windows应用程序,它正在尝试使用以下代码验证Active Directory上的用户/密码 PrincipalContext^ pc = gcnew PrincipalContext(ContextType::Domain); // validate the credentials bool isValid = pc->ValidateCredentials(userName, password); if(!isValid) { throw gcnew Securit

我有一个windows应用程序,它正在尝试使用以下代码验证Active Directory上的用户/密码

PrincipalContext^ pc = gcnew PrincipalContext(ContextType::Domain);
// validate the credentials
bool isValid = pc->ValidateCredentials(userName, password);
if(!isValid)
{
    throw gcnew SecurityTokenValidationException("Invalid user ID / password");
}

UserPrincipal^ upUser = UserPrincipal::FindByIdentity(pc, userName);
if(upUser && !upUser->IsMemberOf(pc, IdentityType::SamAccountName, ADGroup))
{
    String^ msg = "User " + userName + " is not a member of the " + ADGroup + " group.";
    throw gcnew SecurityTokenValidationException(msg);
}
在Visual Studio 2008/.NET 3.5/32位构建下运行此代码时,如果我提供了有效的用户但密码无效,ValidateCredentials()将返回false

使用Visual Studio 2013/.NET 4.0/64位构建,完全相同的代码会引发LdapException:

System.DirectoryServices.Protocols.LdapException: The LDAP server is unavailable.
at System.DirectoryServices.Protocols.LdapConnection.Connect()
at System.DirectoryServices.Protocols.LdapConnection.BindHelper(NetworkCredential newCredential, Boolean needSetCredential)
at System.DirectoryServices.AccountManagement.CredentialValidator.lockedLdapBind(LdapConnection current, NetworkCredential creds, ContextOptions contextOptions)
at System.DirectoryServices.AccountManagement.CredentialValidator.BindLdap(NetworkCredential creds, ContextOptions contextOptions)
at System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
at System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
at soapcon.ADUserNameValidator.Validate(String userName, String password)
如果我断开电脑与网络的连接,会出现
PrincipalServerDownException
异常,因此我很确定我实际上是在与我们的广告服务器通话


这是我的代码有问题吗?.NET有问题吗?或者可能是由于我们非常旧的Active Directory服务设置(Windows 2000)?

我想知道不同的框架是否会使用不同的默认身份验证选项,您能试一下
.ValidateCredentials(字符串、, 一串 ContextOptions)
在这两种情况下都会过载吗

根据注释,在重载中尝试此
ContextOptions
标志:

ContextOptions::Negotiate | ContextOptions::Signing | ContextOptions::Sealing

这不是
c
,而是
c++.net
。顺便问一下,应用程序池是否在IIS配置中的域帐户下执行?IIS的行为不同于Cassiny@bradbury9我没有运行IIS,它只是一个windows应用程序,在我的开发人员域帐户下运行。我想知道不同的框架是否会使用不同的默认身份验证选项,您是否可以尝试
.ValidateCredentials(字符串, 一串 ContextOptions)
在这两种情况下都会过载?@bradbury9是否要添加此注释作为答案?使用“ContextOptions::Negotiate | ContextOptions::Signing | ContextOptions::Sealing;”的ContextOptions似乎解决了我的问题。完成,很乐意帮助:-)