使用C# Novell LDAP包能否查询已认证LDAP用户所属的用户组?
现有代码问题排查
你当前的代码无法查询到用户所属组,核心原因有两点:
- 搜索逻辑错误:你在用户自身DN的子树范围内搜索
objectClass=inetOrgPerson的对象,本质是查询用户本身的条目,完全没有涉及用户组的查询逻辑 - 属性请求配置错误:你指定的查询属性
cn、sn、ou均为用户自身的属性,和用户所属用户组没有关联
修复实现方案
根据你使用的LDAP服务端类型,可选择以下两种通用方案:
方案1:直接读取memberOf属性(推荐,适用Active Directory、开启了memberOf overlay的OpenLDAP)
绝大多数标准LDAP服务都支持memberOf反向属性,会直接在用户条目上挂载该用户所属的所有用户组DN,调整代码即可直接读取:
public bool LogInViaLDAP(LoginDTO userForLoginDto) { var user = userForLoginDto.Username; string userDn = $"cn={user},ou=users,ou=system"; using (var connection = new LdapConnection { SecureSocketLayer = _isSecureSocketLayer }) { connection.ConnectionTimeout = 36000; connection.Connect(_domain, _port); connection.Bind(userDn, userForLoginDto.Password); if (connection.Bound) { // 认证成功后查询用户所属组 var userGroups = GetUserGroups(connection, userDn); // 这里可以对userGroups做后续业务处理 return true; } } return false; } HashSet<string> GetUserGroups(LdapConnection connection, string userDn) { var groups = new HashSet<string>(); // 仅查询memberOf属性 string[] requiredAttributes = { "memberOf" }; var result = connection.Search(userDn, LdapConnection.ScopeBase, "objectClass=*", requiredAttributes, false); if (result.HasMore()) { var userEntry = result.Next(); var attrSet = userEntry.GetAttributeSet(); if (attrSet.TryGetValue("memberOf", out var memberOfAttr)) { for (int i = 0; i < memberOfAttr.Count(); i++) { groups.Add(memberOfAttr.StringValueArray[i]); } } } return groups; }
方案2:反向查询成员包含当前用户的用户组(适用未开启memberOf的OpenLDAP服务)
如果你的LDAP服务不支持memberOf属性,可以通过搜索所有用户组条目,过滤出member属性包含当前用户DN的组即可:
HashSet<string> GetUserGroups(LdapConnection connection, string userDn) { var groups = new HashSet<string>(); // 替换为你实际的用户组存储根节点DN string groupSearchBase = "ou=groups,ou=system"; // 过滤规则:查询类型为用户组、且成员包含当前用户的条目 string searchFilter = $"(&(objectClass=groupOfNames)(member={userDn}))"; string[] requiredAttributes = { "cn" }; var result = connection.Search(groupSearchBase, LdapConnection.ScopeSub, searchFilter, requiredAttributes, false); while (result.HasMore()) { var groupEntry = result.Next(); var groupName = groupEntry.GetAttribute("cn").StringValue; groups.Add(groupName); } return groups; }
内容的提问来源于stack exchange,提问作者Shoni Nemavhidi
相关产品推荐
相关产品推荐

