2011-05-25 237 views
0

我对其他人如何编码感兴趣,因为我要么没有正确理解它,要么我错过了某些东西,或者甚至我做得很对!通过LDAP进行身份验证

首先,这不是LDAP的Active 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为特定用户扫描它(即用户名1)

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

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

谢谢!

回答

0

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

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

+0

System.DirectoryServices是.NET框架的一部分,对不起,如果不清楚。所以这听起来像是我根据你所说的正确地做了。是的,uid是这个对象的唯一标识符,谢谢 – snappymcsnap 2011-05-26 01:15:25

0

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