You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:15:03