2011-11-18 96 views
2

我试图使用应用程序模式(ADAM)对AD进行身份验证,但一直收到未知的用户名或密码错误。如果我在LDP.exe中测试登录,则在简单绑定上登录没有问题。我浏览过所有类似的帖子,但都没有解决,我应该检查什么建议?未知用户名或密码错误,LDAP Active Directory

private bool ValidateActiveDirectoryLogin(string Username, string Password) 
{ 
    bool Success = false; 

    System.DirectoryServices.DirectoryEntry Entry = new System.DirectoryServices.DirectoryEntry("LDAP://localhost:389/OU=Users,O=TestDirectory", Username, Password); 
    System.DirectoryServices.DirectorySearcher Searcher = new System.DirectoryServices.DirectorySearcher(Entry); 
    Searcher.SearchScope = System.DirectoryServices.SearchScope.Subtree; 

    try 
    { 
     System.DirectoryServices.SearchResult Results = Searcher.FindOne(); 
     Success = (Results != null); 
    } 
    catch (Exception ex) 
    { 
     Success = false; 
     throw; 
    } 
    return Success; 
} 

回答

0

确定您的应用程序正在使用的AD的上下文。如果您的ASP.NET应用程序池标识是低权限的,则它将没有足够的权限来查询活动目录。如果您不想创建自定义用户以使用适当的权限运行应用程序池 - 您可以使用LogonUser API在该帐户的安全上下文中进行ValidateActiveDirectoryLogin调用。

最后,如果您使用的是.NET 3.5或更高版本,则应考虑使用System.DirectoryServices.AccountManagement

您可以使用如下代码

bool validCreds = false; 
using (PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
{ 
    validCreds = context.ValidateCredentials(username, password); 
} 
+0

我都试过上下文的,DirectoryEntry的和主 - 都是具有相同的结果,主要使用ContextType.ApplicationDirectory因为它是ADAM。我有应用程序池作为ApplicationPoolIdentity,我尝试使用Localservice,Localsystem,但得到相同的错误。 – PeteTheGreek

+0

只是为了踢,你有没有尝试在web.config中添加标识impersonate = true,它将在请求用户的上下文中执行请求,如果有效的话,perms是问题。 – kd7

+0

试过,没有效果,问题仍然存在。我已经在AD中设置了userprincipalname,如果我在VS中创建一个新站点,并将成员资格提供程序更改为AD,则它不会出现问题,但不会出现上述代码。 – PeteTheGreek

相关问题