我正在使用 C# 连接到 OpenLDAP,当我传入我的用户名和密码时,我必须将它们作为 cn=Username,Password 传递到我的 LdapConnection 对象中。如果我只是传入用户名和密码,我对 Bind 的调用将失败。为什么我必须这样做?我的 OpenLDAP 服务器是否配置错误?
问问题
409 次
1 回答
1
这只是实施的副产品。Novell 的 eDirectory 解决方案采用了非常相似的方法,我使用相同的Novell.Directory.Ldap
代码来处理对 eDirectory 和 OpenLDAP 的绑定请求。现在很明显,用户自己在授权时不必输入他们的整个 CN - 我们可以根据他们的 UID 对他们进行搜索:
//Setup the initial bind for the admin user
var lc = new LdapConnection();
lc.SecureSocketLayer = SSL;
lc.UserDefinedServerCertValidationDelegate += delegate { return true; };
lc.Connect(ServerName, Port);
lc.Constraints.TimeLimit = Timeout;
lc.Bind(AdminUsername, AdminPassword);
现在我只过滤用户,并使用他们的专有名称或完整的容器名称 (CN) 进行绑定:
//Ex. (uid=jsmith)
string filter = config.LdapAuth.LdapFilter.Replace("{{uid}}", username);
//Find the user we're trying to authorize
var lsc = lc.Search(config.LdapAuth.LdapDomain, LdapConnection.SCOPE_SUB, filter, null, false);
if (lsc.hasMore())
{
LdapEntry nextEntry = lsc.next();
//Check the Entries DN so we can properly bind
lc.Bind(nextEntry.DN, Password);
}
这是我能找到的最广泛使用的方法,到目前为止效果很好。
于 2013-04-08T21:20:38.647 回答