我有一个用户名和密码,我需要在让用户进入我的系统之前验证是否在LDAP中找到了用户名和密码。我是LDAP的新手,对某些术语感到很困惑。我知道我需要绑定管理员用户并执行搜索以检查我是否可以在LDAP中找到用户名和密码。然后我应该用用户名和密码绑定用户。
首先,我不太明白为什么我需要在最后一步绑定用户名和密码。
其次,如何绑定管理员用户?我知道它应该采用这种格式
bind("DN, OU and stuff",password=>$password)
我想通过的$password
是什么?
非常感谢你的帮助!
答案 0 :(得分:1)
作为管理员绑定,您可以访问搜索用户。用户绑定可确保密码正确。
答案 1 :(得分:1)
LDAP协议基于请求 - 响应框架,但unsolicited notification
除外。 LDAP客户端将正确形成的请求发送到LDAP服务器,然后读取响应。
当LDAP客户端连接到服务器时,连接未经过身份验证。为了更改连接的身份验证状态,LDAP客户端向服务器发送“BIND”请求。 “BIND”请求是:
然后,服务器确定凭据是否正确,如果是,则服务器将连接的身份验证状态更改为用户名或可分辨名称的状态,并将BIND响应发送到LDAP客户端。如果BIND响应中的结果代码是0
,则LDAP客户端知道用户或可分辨名称存在且凭据正确 - 如果基础对象是,则无需搜索用户已知。
如果连接已存在(例如,如果使用连接池),则客户端可以使用authorization identity request control
或who am i?
扩展请求请求有关连接身份验证状态的信息。某些目录服务器也支持account usable request control
(未在任何标准文档中指定,但由Sun Microsystems发明)。
base DN
是搜索“开始”的专有名称,也就是说,如果搜索范围为one
,搜索响应将包括基本DN和基本DN下一级的条目如果搜索范围为sub
或whole 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]],我的密码是[[此处输入密码]]。我有效吗?”
服务器:[[在这里插入'是'或'否'回答]]
我希望这会有所帮助......
最高