通过LDAP验证

时间:2011-05-25 22:49:54

标签: authentication ldap opends

我对其他人如何对此进行编码感兴趣,因为我要么不正确地理解它,要么我错过了某些东西,或者甚至我做得不对!

首先,这不是LDAP的Open Directory实例,其OpenDS除了一些语法差异之外不应该太重要。

假设我的树结构设置如下:

-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 =组别1

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

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

那时我有我想登录的用户的路径,我可以继续实际的身份验证。我是不是在这里离开基地还是通常如何做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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