1

我有一个用户名和密码,在让用户进入我的系统之前,我需要验证是否在 LDAP 中找到了用户名和密码。我是 LDAP 的新手,对某些术语感到很困惑。我知道我需要绑定管理员用户并执行搜索以检查是否可以在 LDAP 中找到用户名和密码。然后我应该用用户名和密码绑定用户。

首先,我不太明白为什么我需要在最后一步绑定用户名和密码。

其次,如何绑定管理员用户?我知道它应该是这种格式

bind("DN, OU and stuff",password=>$password)

$password应该通过什么?

非常感谢您的帮助!

4

4 回答 4

1

以管理员身份绑定可让您访问搜索用户。以用户身份绑定可确保密码正确。

于 2012-06-07T02:58:41.913 回答
1

LDAP 协议基于请求-响应框架,但unsolicited notification. LDAP 客户端向 LDAP 服务器发送格式正确的请求,然后读取响应。

当 LDAP 客户端连接到服务器时,连接未经过身份验证。为了改变连接的认证状态,LDAP 客户端向服务器发送一个“BIND”请求。“BIND”请求是:

  • 一个简单的 BIND(专有名称和凭据(密码))
  • 一个 SASL BIND(与其他信息一起传输的专有名称或用户名,取决于 SASL 机制

服务器然后确定凭据是否正确,如果正确,则服务器将连接的身份验证状态更改为用户名或专有名称的身份,并将 BIND 响应传输到 LDAP 客户端。如果 BIND 响应中的结果代码是,0 则 LDAP 客户端知道用户或专有名称存在并且凭证是正确的 - 如果基础对象已知,则无需搜索用户

如果连接已经存在(例如,如果使用了连接池),则客户端可以使用扩展请求authorization identity request controlwho am i?扩展请求请求有关连接的身份验证状态的信息。一些目录服务器也支持account usable request control(在任何标准文档中都没有指定,但由 Sun Microsystems 发明)。

是搜索“开始”的base DN可分辨名称,也就是说,如果搜索范围是,则搜索响应将包括基本 DN 和低于基本 DN 一级的条目,如果搜索范围是,则搜索响应将包括基本 DN 之下的one所有条目subwhole subtree.

于 2012-06-07T13:13:14.213 回答
0

1/ 尽可能进行匿名搜索以查找 dn 2/ 进行绑定测试以验证密码

只是给你一些想法,你需要修复下面的一些代码以匹配你的情况。

#!/usr/bin/perl
use Net::LDAP;

my $ldap = Net::LDAP->new($hostname, version => 2);
$mesg = $ldap->search(
    base => $baseDN,
    filter => "uid=$username",
    attrs => ['dn']
);

$result = (1==0);
if ($mesg->code) {
    foreach $entry ($mesg->entries) {
        $dn = $entry->dn;
        $bmesg = $ldap->bind($dn, $password);
        $result = $bmesg->code
    }
}

if ($result) {
    print "Authenticated";
}
于 2012-06-07T03:06:25.943 回答
0

虽然 Ken 提供的 Perl 示例可以工作,但它在技术上不是正确的方法。搜索与简单的凭证验证完全不同。虽然我不会在此评论中讨论“为什么”,但请了解搜索可能会以一种误导的方式表现,具体取决于服务器的配置方式。

正如 Terry 提到的,一种方法是 WhoAmI 操作。这是关于该主题的 CPAN 页面:

http://search.cpan.org/~marschap/perl-ldap-0.56/lib/Net/LDAP/Extension/WhoAmI.pm

如您所见,与搜索相比,WhoAmI 操作非常简单。只需要用户名和密码(某种)。不需要过滤器或搜索属性(也不接受)。

基本上,用外行的话来说,WhoAmI 操作会像这样(对话)工作:

客户:“我的名字是 [[insert DN here]],我的密码是 [[insert password here]]。我有效吗?”

服务器:[[在此处插入“是”或“否”答案]]

我希望这有帮助...

最大限度

于 2013-07-20T21:35:06.220 回答