0

我对其他人如何编码很感兴趣,因为我要么没有正确理解它,要么我遗漏了一些东西,或者我什至做得对!

首先,这不是 LDAP 它的 OpenDS 的 Active Directory 实例,除了一些语法差异之外,它应该没什么大不了的。

所以假设我的树结构设置是这样的:

-dc=somedomain,dc=com
-uid=rootuser
    -ou=Group1
       -uid=username1
       -uid=username2
    -ou=Group2
       -uid=username3
       -uid=username4

为了以“rootuser”身份进行身份验证,我需要在创建 System.DirectoryServices.DirectoryEntry 对象时传递完全限定的用户名,在这种情况下:

uid=rootuser,dc=somedomain,dc=com

但是对于树中的任何其他用户,我必须提前知道要附加到用户名的 LDAP 路径以让他们通过身份验证。因此,例如这将失败:

uid=username1,dc=somedomain,dc=com

但这会起作用:

uid=username1,dc=somedomain,dc=com,ou=Group1

所以我的问题是,当您在登录时不知道用户属于哪个特定组来构建该路径时,您如何处理这个问题?我能想到的唯一方法是将初始调用作为“rootuser”进行,这样我就可以访问整个树,然后使用 System.DirectoryServices.DirectorySearcher 扫描它以查找该特定用户(即 username1)

using (DirectorySearcher searcher = GetDirectorySearcher()) {
    searcher.Filter = "(&(objectClass=person)(uid=" + userName+ "))";
    SearchResult result = searcher.FindOne();
    return result.GetDirectoryEntry().Path;
}

那时我有我想要登录的用户的路径,我可以继续进行实际的身份验证。我在这里离基地很远吗?或者这通常是如何完成的?

谢谢!

4

2 回答 2

0

您可以根据用户独有的属性(例如屏幕名称、电子邮件)构建搜索过滤器。确保配置 LDAP 以确保它们是唯一的。然后找到相应的条目(如果有),获取 DN,并使用适当的密码重新绑定为该用户。如果没有这样的条目,您会做出相应的反应。

您没有说您使用的是什么语言,但在 JNDI 中,这意味着将 DN 设置为安全主体,将密码设置为凭据,并调用 LdapContext.reconnect()。

于 2011-05-25T23:41:40.247 回答
0

SASL 支持使用用户名进行身份验证的概念。您的目录服务器管理员可能能够配置目录服务器以将专有名称映射到身份。给定正确的映射,客户端可以在不知道专有名称的情况下进行身份验证。专业品质的目录服务器支持多种不同的映射机制,例如direct mappingexact matchregular expression或自定义身份映射器。

于 2011-06-26T14:25:22.340 回答