1

我正在使用 C# 连接到 OpenLDAP,当我传入我的用户名和密码时,我必须将它们作为 cn=Username,Password 传递到我的 LdapConnection 对象中。如果我只是传入用户名和密码,我对 Bind 的调用将失败。为什么我必须这样做?我的 OpenLDAP 服务器是否配置错误?

4

1 回答 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 回答