C# 使用IP地址和端口号连接LDAP

C# 使用IP地址和端口号连接LDAP,c#,active-directory,ldap,directoryentry,directorysearcher,C#,Active Directory,Ldap,Directoryentry,Directorysearcher,我工作的公司有一个产品,它使用Active Directory,通过包含和组件的库来启用我们产品的安全功能 如果某人是组FOO的成员,则他们具有标准访问权限。如果他们是FOO-ADMIN的成员,他们拥有管理员权限 我们有一个不使用Active Directory的潜在客户。他们有一个运行LDAP的Apache服务器,他们提供了这个屏幕截图 上面,看起来我需要连接到xxx.xxx.5.101:389的域(即DirectoryEntry(“LDAP://xxx.xxx.5.101:389”)),但

我工作的公司有一个产品,它使用Active Directory,通过包含和组件的库来启用我们产品的安全功能

如果某人是组
FOO
的成员,则他们具有标准访问权限。如果他们是
FOO-ADMIN
的成员,他们拥有管理员权限

我们有一个不使用Active Directory的潜在客户。他们有一个运行LDAP的Apache服务器,他们提供了这个屏幕截图

上面,看起来我需要连接到xxx.xxx.5.101:389的域(即DirectoryEntry(“LDAP://xxx.xxx.5.101:389”)),但是“DN或user”字段如何与密码匹配

Active Directory组件是否能够在Apache系统上执行LDAP身份验证,或者代码是否需要完全不同的控件? 以下是我编写的一些粗略代码:

/// <summary>
/// Untested Method
/// </summary>
/// <param name="hostIp">String (EX: xxx.xxx.5.101)</param>
/// <param name="port">Int (EX: 389)</param>
/// <param name="user">String (EX: cn=danibla,ou=sysdata,ou=townhall,o=toh)</param>
/// <param name="password">String - provided password</param>
/// <param name="groupsLike">String (EX: find all groups like FOO)</param>
/// <returns>String[] array of matching membership groups</returns>
public static String[] GetMemberships(String hostIp, int port, String user, String password, String groupsLike)
{
    var results = new List<String>();
    var path = String.Format("LDAP://{0}:{1}", hostIp, port);
    using (var entry = new DirectoryEntry(path, user, password))
    {
        using (var search = new DirectorySearcher(entry, String.Format("(CN={0}*)", groupsLike)))
        {
            var expression = new Regex("CN=([^,]*),", RegexOptions.Compiled & RegexOptions.IgnoreCase);
            foreach (SearchResult item in search.FindAll())
            {
                var match = expression.Match(item.Path);
                var name = match.Groups[1].Value;
                if (name.StartsWith(groupsLike, StringComparison.OrdinalIgnoreCase))
                {
                    if (!results.Contains(name))
                    {
                        results.Add(name);
                    }
                }
            }
        }
    }
    return results.ToArray();
}

Apache可以运行LDAP,我的建议是确保您的客户机在其服务器上正确配置了LDAP。这可以在他们服务器上的httpd.conf中完成

我希望有更多的时间给你一个更完整的答案。但让我看看这是否有帮助。组成员资格在eDirectory中的工作方式不同,并且没有memberOf属性。您还可能会发现,您必须使用比DirectoryEntry、DirectorySearcher等更低的级别。。。(因为这些是为广告量身定做的)。System.DirectoryServices.Protocols将为您提供较低级别的访问权限

另一方面,Novell也有C类库,你可以考虑使用:

  • 我建议您首先以用户身份绑定到数据库,并具有搜索或匿名(如果匿名可以搜索)所需的权限,然后搜索(&(cn=USERNAME)(objectclass=Person))以查找需要绑定为的dn
  • 现在使用提供的凭据绑定为您找到的用户dn,并获取groupMembership属性
  • 检查groupMembership属性以确定您的权限 如果无法使groupMembership属性正常工作,也可以在目录中搜索组:((cn=GROUPNAME)(objectclass=groupOfNames)) 然后,您可以通过groupOfNames:member属性查找您的用户名

    我会先尝试绑定/验证,然后添加组内容。这里有一个绑定示例:

    或者,如果您有证书问题,请在此使用另一种方法:

    以下是一些有用的参考资料:


    LDAP是一种协议,因此,只要您使用的产品仅使用协议的标准操作,连接到Apache DS而不是AD就不会有任何问题。如果您使用自定义AD控件(不属于LDAP协议的一部分,但只有您知道这一点),则会出现问题;)这应该是一条评论,我的坏蛋。给我发截图的人是另一家公司的IT人员,他们可以连接到LDAP。我们需要一种方法让我们的程序使用LDAP进行身份验证。如果我们做不到,我们就不进行销售。上面显示的是他在名为eDir的工具上连接时使用的所有参数(我不知道是什么)。如果他们使用LDAP进行身份验证,他们将具有LDAP服务器配置,您需要用户名、密码、服务器名和LDAP驱动程序。如果你像我说的那样使用apache,你将不得不使用httpd.conf连接到他们的LDAP服务器配置你是否尝试ping他们的IP和包含它的端口?我的建议是创建一个apache环境,如果你只是在谷歌上搜索如何在Windows上设置Apache24,假设您正在使用Windows并运行该程序,然后在httpd.conf中使用LDAP配置在那里运行您的程序。您应该能够正确地测试它。请参阅本文。我现在正在读。这可能是我需要的!这并没有完全解决我的问题,但我也没有完全看完你在这里添加的链接列表。谢谢。非常感谢你慷慨的赏金。如果您遇到了特定问题,请告诉我,我可以尝试进行更多研究。我在C#中实现了AD LDAP集成,在Ruby中实现了非AD LDAP实现。但我没有在c#中做过非广告,所以很遗憾我没有代码可以共享。
    public static String[] Groups(String domain, int port, String username, int authenticationValue, String startsWith)
    {
        String name;
        var results = new List<String>();
        var ldapPath =
            String.IsNullOrEmpty(domain) ? null :
            (0 < port) ?
            String.Format("LDAP://DC={0}:{1}", domain, port) :
            String.Format("LDAP://DC={0}", domain);
        using (var entry = new DirectoryEntry(String.Format("WinNT://{0}/{1}", Environment.UserDomainName, username)))
        {
            name = String.Format("{0}", entry.Properties["fullName"].Value);
        }
        var filter = String.Format("(CN={0}", name);
        var expression = new Regex("CN=([^,]*),", RegexOptions.Compiled & RegexOptions.IgnoreCase);
        using (var entry = new DirectoryEntry(ldapPath))
        {
            entry.AuthenticationType = (AuthenticationTypes)authenticationValue;
            using (var search = new DirectorySearcher(entry) { Filter = filter })
            {
                search.PropertiesToLoad.Add("memberOf");
                try
                {
                    foreach (SearchResult item in search.FindAll())
                    {
                        foreach (var property in item.Properties["memberOf"])
                        {
                            var name = expression.Match(String.Format("{0}", property)).Groups[1].Value;
                            if (name.StartsWith(startsWith, StringComparison.OrdinalIgnoreCase))
                            {
                                if (!results.Contains(name))
                                {
                                    results.Add(name);
                                }
                            }
                        }
                    }
                }
                catch (Exception err)
                {
                    LogError("Groups", err);
                }
            }
        }
        return results.ToArray();
    }