C# 使用IP地址和端口号连接LDAP
我工作的公司有一个产品,它使用Active Directory,通过包含和组件的库来启用我们产品的安全功能 如果某人是组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”)),但
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类库,你可以考虑使用:
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();
}