LDAP 认证

轻量级目录访问协议 (LDAP) 是一种因特网协议,用于通过网络访问和维护分布式目录信息服务。 如果使用 LDAP 来认证 Web 应用程序的用户,请在开始之前花一点时间来查看本主题的内容。

编程准则

使用 LDAP 进行认证时,请遵循以下准则:
  • 仅使用 LDAP 接口 - 只能通过连接到 LDAP 服务器来认证用户。
  • Active Directory - 禁止使用 Active Directory 接口,但支持采用 Active Directory 的 LDAP 认证。
  • 管理员属性 - LDAP 管理员必须对所有用户的 LDAP 属性具有访问权。
IBM® API Connect 读取的 LDAP 属性如下所示:
属性 定义
mail 用户的 SMTP 电子邮件地址。
cn 内部使用,用于确定用户的常用名。
sn 内部使用,用于确定用户的姓氏。
givenname 内部使用,用于确定用户的名字。
来自 Search dn 的前缀 用作用户名。

使用 LDAP 服务器来认证用户

LDAP 目录服务器中的每个条目都具有专有名称 (DN)。 DN 是用于唯一标识该目录中条目的名称。 DN 由使用逗号分隔的 attribute=value 对组成。 例如:
cn=Ben Gray,ou=editing,o=New York Times,c=US
cn=Lucille White,ou=editing,o=New York Times,c=US
cn=Tom Brown,ou=reporting,o=New York Times,c=US

目录模式中定义的任何属性都可用于构成 DN。 组成部分属性值对的顺序非常重要。 对于从根目录往下到条目所在级别的目录层次结构中的每个级别,DN 都包含一个相应的组成部分。 LDAP DN 以最具体的属性(通常是某种名称)开始,后面跟有范围越来越广泛的属性,通常最后以国家或地区属性结尾。 DN 的第一个组成部分称为相对专有名称 (RDN)。 它清楚地将某个条目与所有其他具有相同父代的条目区分开。 在之前的示例中,RDN“cn=Ben Gray”将第一个条目和第二个条目(具有 RDN“cn=Lucille White”)区分开。 在其他方面,这两个示例 DN 完全相同。 构成条目 RDN 的“属性=值”对也必须存在于该条目中。 (这不适用于 DN 的其他组成部分。)

示例

在以下示例中,使用基本 DN 执行用户搜索。 该搜索以匿名方式进行;如果使用了认证绑定,那么将使用已认证的用户。 搜索 DN 将附加前缀、给定用户名和后缀。 如果使用的前缀为“(uid=”,而使用的后缀为“)”,那么 uid 将成为用户名属性。 使用的缺省搜索过滤器为:(|(cn={filter}*)(sn={filter}*)(mail={filter}*)(givenName={filter})),用作前缀的属性也将添加到搜索过滤器中。 在此例中,“(uid=”是前缀,在搜索用户时,搜索过滤器将为:
  (|(cn={filter}*)(sn={filter}*)(mail={filter}*)(givenName={filter}*)(uid={filter}*))
其中 {filter} 将替换为实际文本。

已认证的绑定 DN 是外部 LDAP 服务器上的一个用户,有权获取基本 DN 并在定义的搜索库内搜索 LDAP 目录。 它还应该能够读取其他用户属性,并在不允许匿名访问 LDAP 以获取基本 DN 以及搜索用户属性并获取其访问权的情况下使用。 在搜索 Steve 时,将使用以下示例中显示的 LDAP 查询过滤器,并从 UI 中指定的基本 DN 完成搜索。 在返回用户 DN 后,将使用该 DN 及密码来认证用户:

(|(cn=Steve*)(sn=Steve*)(mail=Steve*)(givenName=Steve*)(uid=Steve*)).
对于登录调用期间的绑定,所使用的搜索字符串是前缀。 例如,如果前缀为“(uid=”,那么用于在登录期间搜索用户的搜索字符串将为:(uid=Steve)。
将 mail 属性用作用户名
当您要使用电子邮件地址作为用户名 (例如 steve@company.com) 时,通常使用 mail 属性作为前缀 "(mail=")。 在这种情况下,请使用以下搜索字符串在内部执行搜索 (假定 "(mail=" 作为前缀)):
(|(cn=steve@company.com*)(sn=steve@company.com*)(mail=steve@company.com*)
(givenName=steve@company.com*)(mail=steve@company.com*))  
在之前的示例中,如果找到 DN,那么将结合使用该 DN 和密码来执行绑定。 将获取第一个结果,因此请确保针对用户名使用唯一属性。 接下来,将读取用户的 LDAP 属性 (cnsnmailgivenName)。 如果无法使用登录用户读取 LDAP 属性,那么将使用已认证的绑定凭证从用户的 DN 中读取这些属性。 如果用户名属性不同,那么还将查询用户名属性。 例如,如果前缀为“(uid=”,那么还将从用户的 DN 对象中读取 uid 属性:
(|(cn={filter}*)(sn={filter}*)(mail={filter}*)(givenName={filter}*))
注: 前缀和后缀不能用于直接获取用户的 DN。 例如,以下直接获取用户 DN 的尝试将失败:
Prefix: "uid=", Suffix: ",ou=users,dc=company,dc=com"

LDAP 引荐

通过 LDAP 引荐,可以将目录树分区并使其分布在多个 LDAP 服务器之间。 LDAP 引荐是域控制器使用的一种方式,向客户机应用程序指示其不具有所请求对象的副本,而是向客户机提供该对象可能的保存位置。 之后,客户机使用该对象作为域控制器的 DNS 搜索基础。

API Connect 对 LDAP 引荐的支持包括:
  • 搜索属于多个 Active Directory 树和森林的用户。
  • 云管理器API 管理器CMS 门户中验证用户身份。
注: API Connect LDAP 引荐支持取决于以下条件:
  • 使用管理员凭证来配置单个 LDAP 主机/端口,并从树/服务器的基本 DN 中引用所有用户。
  • 遵循 LDAP 引荐进行用户搜索时,下游树/森林中将使用相同的管理员凭证。
  • LDAP API 认证不支持外部 LDAP 引荐。 支持内部 LDAP 引荐。