【问题标题】:Verifying user's credentials with LDAP using Net::LDAP使用 Net::LDAP 使用 LDAP 验证用户的凭据
【发布时间】:2020-08-24 03:53:51
【问题描述】:

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

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

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

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

我想通过的$password 是什么?

非常感谢您的帮助!

【问题讨论】:

    标签: perl ldap


    【解决方案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。

    【讨论】:

    • 假设"$mesg = $ldap->search(base => $baseDN,filter =>uid=$username");",那么如果找不到用户名,会$mesg->代码为 0?
    • 搜索可以成功,返回零结果。如果条目与搜索参数匹配,则 API 搜索结果中的条目数字段将不为零。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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";
      }
      

      【讨论】:

        【解决方案4】:

        虽然 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]]。我有效吗?”

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

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

        最大

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 2022-01-08
          • 1970-01-01
          相关资源
          最近更新 更多