打开 LDAP 身份验证-如何在不绑定的情况下验证用户密码?

打开 LDAP 身份验证-如何在不绑定的情况下验证用户密码?

我在做什么...

尝试为我们组织的所有机器、博客、wiki、CRM、HRM、项目管理工具、SVN 等实现单点登录……

我们在运行 CentOS 的专用服务器上安装并配置了 OpenLDAP。我使用 phpLdapAdmin 添加组织结构和有关各种用户、客户、资源的信息。

用户的示例条目...

DN 是 :: cn=Bill Gates, ou=users, dc=example, dc=com

用户 ID :: bill.gates

邮件 ::[电子邮件保护]

用户密码 :: as2%$%66789ds (一些 md5 加密值)

我现在在哪里……

OpenLDdap 运行良好。绑定测试也成功运行。

我想做的事...

使用更高权限的用户进行绑定,然后根据用户输入的用户 ID 或邮件搜索用户,这与 CN 略有不同。重点是我想根据不属于 RDN 的属性对用户进行身份验证。

我被困在哪里了......

  1. 我无法使用 userid 进行绑定,因为它不属于 DN。一般情况下允许这样做吗?
  2. 我可以使用不同的 LDAP 用户(例如高权限用户)进行绑定,然后执行 ldap_search 以根据过滤器 userId 获取唯一记录,但用户输入的密码的 md5 与 userPassword 字段不匹配。OpenDLdap 使用一些盐进行加密。我也不想删除盐。有什么办法吗?

我的问题(最后)

  1. 我们可以对不属于 RDN 的属性执行 ldap_bind 吗?
  2. 我们可以发送未加密的密码吗(我将使用 HTTPS 隧道以确保安全)到 OpenLDAP 服务器并要求 OpenLDAP 加密并核对用户密码文件?这通常是我们在所有 Web 应用中所做的,对吗?
  3. (题外话)用户 ID 可以包含 .(点)和空格吗?我们需要在“First Name(givenName)”和“Last Name(sn)”之间添加一些字符。哪一个是安全字符?我的意思是,世界上所有(或大多数)应用程序都允许在用户名中使用哪些非 aplha 数字字符?

我最关心的是采用一种可以轻松与大多数应用程序配合使用的方法。在我们的任务单点登录期间,我们将修改许多基于 Web 的应用程序、桌面软件等!

感谢您的阅读...并提前感谢您的帮助!

-拉胡尔

答案1

关于第一个问题:

我曾使用过另一个允许针对各种用户属性进行“登录”的 LDAP 系统。解决方案是建立两个连接。第一个连接(可能是匿名绑定)使用用户提供的信息查询 LDAP 以找到其用户对象的 RDN。第二个连接尝试使用发现的 RDN 和提供的密码进行密码绑定。这是一个两步过程,并且有效。

不过,如果此应用程序要获取大量带有非 RDN 本身所提供属性的登录信息,那么对这些属性进行索引将是一个好主意。这是为了提高性能。

二:

据我所知,OpenLDAP 支持 LDAP-SSL(TCP/636),这可能是比 HTTPS 隧道更好的路由。默认情况下,LDAP 绑定是明文的,但 LDAP 扩展允许使用其他方法。例如,Active Directory 允许 NTLM LDAP 绑定,而且我很确定 LDAP 在某些时候也经过了 Kerberos 化。我不知道 openLDAP 支持哪些方法。

三:

我有包含以下电子邮件的 LDAP 源“[电子邮件保护]“格式的属性。命名属性变得更加棘手,而这正是我的 openLDAP 体验失败的地方。我不知道支持这一点。我知道 Active Directory 允许在命名属性中使用空格,而 Novell eDirectory 允许使用空格和句点(尽管不建议这样做)。通常,命名属性是 userID,而 givenName、surname、emailAddress 等属性包含特殊字符。由于它们不是命名属性,因此没有相同的限制。

答案2

恐怕我对 OpenLDAP 不够了解,无法提供具体的帮助,但我想知道它是否具有类似于 OpenDS 的功能身份映射功能你可以使用

这个想法是,客户端可以使用自定义身份来标识自己,然后映射使用正则表达式将其与用户条目上的任何其他属性进行匹配。在 OpenDS 中,这似乎使用了 SASL 选项,因此使用他们的工具,我可以提供以下选项:

bin/ldapsearch --saslOption authid=u:dominic --saslOption mech=PLAIN [..]

然后,身份映射器使用身份验证 ID,在本例中,它与我的用户条目上的 uid 属性匹配。

希望有帮助!

相关内容