2011-03-09 187 views
8

如何在C#.NET for ASP中從LDAP活動目錄中獲取用戶組的用戶組。在我的方案中,我想將用戶名傳遞給從LDAP Active Directory中查詢的方法,並告訴我我的用戶是此用戶組的成員。請在此幫助我從LDAP查詢用戶組

回答

12

如果你在.NET 3.5或更新版本,您還可以使用新的System.DirectoryServices.AccountManagement(S.DS.AM)命名空間。

有了這個,你可以這樣做:

// create context for domain 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// find the user 
UserPrincipal up = UserPrincipal.FindByIdentity(ctx, "YourUserName"); 

if(up != null) 
{ 
    // get groups for that user 
    var authGroups = up.GetAuthorizationGroups(); 
} 

瞭解更多關於新S.DS.AM命名空間:

Managing Directory Security Principals in the .NET Framework 3.5

3

使用System.DirectoryServices命名空間進行調查。您可以使用DirectorySearcher來查找用戶。一旦你的DirectoryEntry對象爲用戶做到這一點:

public List<string> GetMemberOf(DirectoryEntry de) 
{ 
    List<string> memberof = new List<string>(); 

    foreach (object oMember in de.Properties["memberOf"]) 
    { 
    memberof.Add(oMember.ToString()); 
    } 

    return memberof; 
} 

這將返回字符串這是組名用戶的成員名單。

當然,您可以進一步優化以包含DirectorySearcher代碼,以便您可以傳遞函數samAccountName。

3

試試這個...

public override string[] GetRolesForUser(string username) 
    { 
    var allRoles = new List<string>(); 
    var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString, 
            ConnectionUsername, 
            ConnectionPassword); 

    var searcher = new DirectorySearcher(root, 
             string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)({0}={1}))", 
                        AttributeMapUsername, 
                        username)); 

    searcher.PropertiesToLoad.Add("memberOf"); 
    SearchResult result = searcher.FindOne(); 
    if (result != null && !string.IsNullOrEmpty(result.Path)) 
    { 
     DirectoryEntry user = result.GetDirectoryEntry(); 
     PropertyValueCollection groups = user.Properties["memberOf"]; 
     foreach (string path in groups) 
     { 
      string[] parts = path.Split(','); 
      if (parts.Length > 0) 
      { 
       foreach (string part in parts) 
       { 
        string[] p = part.Split('='); 
        if (p[0].Equals("cn", StringComparison.OrdinalIgnoreCase)) 
        { 
         allRoles.Add(p[1]); 
        } 
       } 
      } 
     } 
    } 
    return allRoles.ToArray(); 
} 
0

我認爲上面列出的大多數方法應該可以工作,但我會建議添加代碼以確保您的代碼可以「檢測嵌套組成員身份中的循環循環」,並且如果找到,可以打破您選擇的腳本可能潛入的任何無限循環。

2

我需要一種驗證用戶和檢查方法來查看它們是否在特定用戶組中。我通過推送用戶名和密碼並將「memberOf」屬性加載到「搜索」實例中來完成此操作。下面的示例將顯示該特定用戶名的所有組。 'catch'語句將捕獲錯誤的用戶名或密碼。

DirectoryEntry entry = new DirectoryEntry("LDAP://xxxxxxxx/OU=xxxxxxx,DC=xxxxxx,DC=xxxxx,DC=xxxxxx", strLdapUserName, strLdapPassword); 

    try 
    { 
    //the object is needed to fire off the ldap connection 
    object obj = entry.NativeObject; 

    DirectorySearcher search = new DirectorySearcher(entry); 
    search.Filter = "(SAMAccountName=" + strLdapUserName + ")"; 
    search.PropertiesToLoad.Add("memberOf"); 
    SearchResult result = search.FindOne(); 
    string filterAttribute = (String)result.Properties["cn"][0]; 

    foreach(string groupMemberShipName in result.Properties["memberOf"]) 
    { 
     Console.WriteLine("Member of - {0}", groupMemberShipName); 
    } 

    } 
    catch (Exception ex) 
    { 
    //failed to authenticate 
    throw new Exception(ex.ToString()); 
    } 

希望這會有所幫助。 (記得引用System.DirectoryServices)