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 controlまたはwho am i?拡張要求を使用して、接続の認証状態に関する情報を要求できます。一部のディレクトリ サーバーは、account usable request control(どの標準ドキュメントにも指定されていませんが、Sun Microsystems によって発明されました) もサポートしています。

base DN、検索が「開始」される識別名です。つまり、検索範囲が である場合、検索応答には、ベース DN およびベース DN の 1 レベル下のエントリが含まれ、検索範囲がまたはoneである場合、ベース DN より下のすべてのエントリが含まれます。 .subwhole subtree

于 2012-06-07T13:13:14.213 に答える
0

Ken が提供する Perl の例は機能しますが、技術的には適切なアプローチではありません。検索は、単純な資格証明の検証とはまったく異なります。この発言の「理由」については説明しませんが、サーバーの構成によっては、検索が誤解を招くような動作をする可能性があることを理解しておいてください。

Terry が述べたように、1 つの方法は WhoAmI 操作です。この件に関するCPANページは次のとおりです。

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

ご覧のとおり、WhoAmI 操作は検索と比較すると非常に単純です。ユーザー名とパスワード (何らかの種類) のみが必要です。フィルターも検索属性も必要ありません (受け入れられません)。

基本的に、素人の言葉で言うと、WhoAmI 操作は次のように機能します (会話的に):

クライアント: 「私の名前は [[DN をここに挿入]] で、パスワードは [[パスワードをここに挿入]] です。私は有効ですか?」

サーバー: [[「はい」または「いいえ」の回答をここに挿入]]

これが役立つことを願っています...

マックス

于 2013-07-20T21:35:06.220 に答える
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 に答える