C#Active Directory,登录特定OU

时间:2015-04-09 16:19:13

标签: c# active-directory

我想只登录一个特定的OU,但不能登录以前的OU。

我的父母职能是:

    if (Autentificado("LDAP://localhost/DC=ic,DC=enterprise,DC=us", user, pass, "cn=SpecificPeople,ou=Users,ou=Aplications,dc=ic,dc=enterprise,dc=us") != "")
    {

                    return "OK";
    }

它包含服务器方向,包含path,user,pass和“memberof”过滤器的字符串:

public static string Autentificado(string ldap, string usr, string pwd,string member)
        {
          try
            {
                DirectoryEntry entry = new DirectoryEntry(ldap, usr, pwd);
                DirectorySearcher search = new DirectorySearcher(entry)
                {

                  Filter = "(&(objectCategory=person)(memberof=" + member + "))"

                };
                search.PropertiesToLoad.Add("sn");
                SearchResult result = search.FindOne();
                return result.Properties["sn"][0].ToString();
            }
            catch (DirectoryServicesCOMException cex)
            {
                Console.WriteLine(cex);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            return "";


        }

它返回“OU = Users”的正确用户,但它返回其他OU或DC的用​​户。我希望人们只能登录“OU = Users”。

提前致谢。

更新1: 我认为问题在于我的LDAP结构和DirectorySearcher的过滤器:

DC=US
 -DC=enterprise
  -DC=ic
   -OU=Apps
     -OU=1
     -OU=2
     -OU=USERS

如果我使用: SearchScope.Subtree ,它会在所有目录中搜索。 SearchScope.OneLevel ,它会在DC = enterprise或所有OU = Apps中搜索(如果我没错。) SearchScope.Base ,它在DC = US中搜索。

我希望搜索只能在 OU = USERS 中进行,而不是在其他目录中进行(OU = 1,OU = 2)。

更新2

我的GETUSER功能是:

DirectoryEntry usercheck = GetUser(user, pass,"LDAP://someIP:389/CN=qualifiers,OU=USERS,OU=Aplications,DC=ic,DC=enterprise,DC=us");

在“DirectoryEntry searchRoot”中,我需要设置用户和密码才能输入LDAP。如果没有,它会带我错误:

using (DirectoryEntry searchRoot = new DirectoryEntry(rootWeAreLooking,"ic\\"+userName,pass, AuthenticationTypes.None))

我发现这可能有效,但它会搜索 OU = Aplications 的所有目录。

我认为我需要按 CN = qualifiers 过滤,但我不知道如何。

更新3

我需要正确尝试,但我认为我做了正确的过滤器:

searcher.Filter = String.Format("(&(objectCategory=person)(memberof=CN=qualifiers,OU=USERS,OU=Aplications,DC=ic,DC=enterprise,DC=us)(sAMAccountName={0}))", userName);

2 个答案:

答案 0 :(得分:3)

所以我刚刚创建了这个代码来完成你想要的东西。我将代码拆分为多个方法,因此您可以使用其他单个函数,例如ValidateUser其他。

  1. 找到AD中的用户和您正在搜索的ou(root)并使shure退出
  2. 现在我们知道他被允许"登录"我们正在验证他对AD的密码。
  3. 如果一切顺利,用户就在OU=USER(在您的情况下),密码也是正确的

    private void TestTheMethods()
    {
        //Search for the user, in the ou "user" 
        DirectoryEntry user = GetUser("FirstName LastName","FullOrganisationUnitPath");
        //Found user?
        if (user == null) { return; }
    
        //ValidateUser
        if (!ValidateUser(user, "userPassword")) { return; }
    }     
    
    public DirectoryEntry GetUser(string userName, string rootWeAreLooking = "")
    {
        DirectoryEntry user = null;
    
        using(DirectoryEntry searchRoot = new DirectoryEntry(rootWeAreLooking))
        using(DirectorySearcher searcher = new DirectorySearcher(searchRoot))
        {
            searcher.Filter = String.Format("(&(objectCategory=person)(cn={0}))",userName);
            //searcher.SearchScope = SearchScope.Subtree;
    
            //SearchScope.Subtree --> Search in all nested OUs
            //SearchScope.OneLevel --> Search in the Ou underneath
            //SearchScope.Base    --> Search in the current OU
    
            search.SearchScope = SearchScope.OneLevel;
    
            SearchResult result = searcher.FindOne();
            if (result == null) { return null; }
    
            //Found user
            return result.GetDirectoryEntry();
        }
    }
    
    public Boolean ValidateUser(DirectoryEntry entry, string pwd)
    {
        Boolean isValid = false;
    
        try
        {
            DirectoryEntry validatedUser = new DirectoryEntry(entry.Path, entry.Name.Remove(0,3), pwd);
            //Check if we can access the Schema
            var Name = validatedEntry.SchemaEntry;
            //User exits, username is correct and password is accepted
            isValid = true;
        }
        catch(DirectoryServicesCOMException ex)
        {
            isValid = false;
            ///User wrong? wrong password?
        }
    
        return isValid;
    }
    

答案 1 :(得分:1)

最后,我做了这个过滤器,并为我工作:

searcher.Filter = String.Format("(&(objectCategory=person)(memberof=CN=qualifiers,OU=USERS,OU=Aplications,DC=ic,DC=enterprise,DC=us)(sAMAccountName={0}))", userName);

在我的LDAP路径中,我放了根路径目录

DC=ic,DC=enterprise,DC=us