使用Net :: LDAP使用LDAP验证用户的凭据

时间:2012-06-07 02:55:03

标签: perl ldap

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

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

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

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

我想通过的$password是什么?

非常感谢你的帮助!

4 个答案:

答案 0 :(得分:1)

作为管理员绑定,您可以访问搜索用户。用户绑定可确保密码正确。

答案 1 :(得分: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是搜索“开始”的专有名称,也就是说,如果搜索范围为one,搜索响应将包括基本DN和基本DN下一级的条目如果搜索范围为subwhole subtree,则基本DN下方的所有条目。

答案 2 :(得分: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";
}

答案 3 :(得分:0)

虽然Ken提供的Perl示例可行,但从技术上讲,它不是正确的方法。与简单的凭证验证相比,搜索完全不同。虽然我不会在这句话中加入“为什么”,但要理解搜索可能会以误导的方式运行,具体取决于服务器的配置方式。

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

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

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

基本上,就外行而言,WhoAmI操作会像这样工作(对话):

客户:“我的名字是[[此处插入DN]],我的密码是[[此处输入密码]]。我有效吗?”

服务器:[[在这里插入'是'或'否'回答]]

我希望这会有所帮助......

最高