专有名称包含无效的语法错误

时间:2010-06-02 17:01:28

标签: openldap

我正在尝试使用LDAP对用户进行身份验证,但我遇到了LDAP问题。

这是我的代码:

string hostOrDomainName = "MrHand-PC";
string targetOu = "cn=Huy Pham,ou=people,dc=example,dc=com";

// create a search filter to find all objects
string ldapSearchFilter = "uid=pdhuy";

// establish a connection to the directory
LdapConnection connection = new LdapConnection(hostOrDomainName);

Console.WriteLine("\r\nPerforming a simple search ...");
SearchRequest searchRequest = new SearchRequest(targetOu, ldapSearchFilter, 
    System.DirectoryServices.Protocols.SearchScope.OneLevel, null);

// cast the returned directory response as a SearchResponse object
SearchResponse searchResponse =
            (SearchResponse)connection.SendRequest(searchRequest);

最后一行抛出异常:The distinguished name contains invalid syntax.

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

要对LDAP进行身份验证,您可以尝试以下操作(域,用户名和密码是参数):

bool IsAuthenticated = false;            
string domainAndUsername = domain + @"\" + username;
string dirContext = GetAuthenticatingDirectory(domain);
using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + dirContext, domainAndUsername, password))
{
    try
    {
        Object obj = entry.NativeObject;
        DirectorySearcher search = new DirectorySearcher(entry);
        search.Filter = "(SAMAccountName=" + username + ")";
        search.PropertiesToLoad.Add("cn");
        SearchResult result = search.FindOne();
        if (result != null)
        {
            IsAuthenticated = true;                            
        }
    }
    catch (Exception e)
    {
        //handle appropriately according to your requirements
    }
}

return IsAuthenticated;

其中GetAuthenticatingDirectory()定义为

private string GetAuthenticatingDirectory(string domain)
{
    string authenticatingDirectory = string.Empty;
    string dotComDomain = domain + @".com";

    // Connect to RootDSE
    using (DirectoryEntry RootDSE = new DirectoryEntry("LDAP://rootDSE"))
    {
        // Retrieve the Configuration Naming Context from RootDSE
        string configNC = RootDSE.Properties["configurationNamingContext"].Value.ToString();

        // Connect to the Configuration Naming Context
        using (DirectoryEntry configSearchRoot = new DirectoryEntry("LDAP://" + configNC))
        {
            // Search for all partitions where the NetBIOSName is set.
            using (DirectorySearcher configSearch = new DirectorySearcher(configSearchRoot))
            {
                configSearch.Filter = ("(NETBIOSName=*)");

                // Configure search to return dnsroot and ncname attributes
                configSearch.PropertiesToLoad.Add("dnsroot");
                configSearch.PropertiesToLoad.Add("ncname");
                using (SearchResultCollection forestPartitionList = configSearch.FindAll())
                {
                    // Loop through each returned domain in the result collection
                    foreach (SearchResult domainPartition in forestPartitionList)
                    {
                        // domainName like "domain.com". ncName like "DC=domain,DC=com"
                        string domainName = domainPartition.Properties["dnsroot"][0].ToString();
                        string ncName = domainPartition.Properties["ncname"][0].ToString();

                        if (dotComDomain.Equals(domainName, StringComparison.OrdinalIgnoreCase))
                        {
                            authenticatingDirectory = ncName;
                            break;
                        }
                    }
                }
            }
        }
    }

    return authenticatingDirectory;
}