gpt4 book ai didi

c# - 使用 IP 地址和端口号连接的 LDAP

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:58 26 4
gpt4 key购买 nike

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

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

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

Customer Properties

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

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();
}

我对他们为“DN 或用户”字段传递的“类路径”参数感到困扰,尤其是当它显示他们提供密码时。

我们没有 Apache 环境来测试它。我们公司不希望我带着很多不必要的问题去找这个客户。

更新:
仍然需要一种方法来做到这一点。开始赏金。也许引起一些注意会给我一个解决方案。

currentState

在上面的截图中,代码中username的值是cn-mikead,ou=sysdata,ou=townhall,o=toh和单独的mikead,两者在调用 FindAll() 时都出现相同的 COM 异常。

这是我现在的代码。

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();
}

最佳答案

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

关于c# - 使用 IP 地址和端口号连接的 LDAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46458510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com