Отличительное имя содержит ошибку недопустимого синтаксиса

Я пытаюсь использовать 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
задан Michael Mrozek 2 June 2010 в 17:02
поделиться

1 ответ

Для аутентификации по 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;
}
2
ответ дан 3 September 2019 в 00:06
поделиться