基本処理

以下のセクションでは、SASL プラグインを使用して拡張認証機能を提供する場合の標準的なフローについて説明します。

このフローは、SASL プラグイン共有ライブラリーが既に LDAP ライブラリーによってロードされていることを前提としています。
  1. アプリケーションは、構成済みの SASL プラグインによってサポートされるメカニズムを使用して、ldap_sasl_bind_s() を呼び出します。
  2. LDAP ライブラリーは、該当するプラグインによって提供される SASL バインド・ワーカー機能を呼び出します。 元の ldap_sasl_bind_s() API で提供されるパラメーターは、pblock 構造体のエレメントとしてプラグインに渡されます。
  3. プラグイン・ワーカー関数は制御を受け取り、 ldap_plugin_pblock_get() API を使用して pblock からパラメーターを抽出します。 このプラグインによって、以下の SASL 関連情報を pblock から取得できます。
    • 識別名 (dn)
    • 資格情報
    • サーバー・コントロール
    • クライアント制御
    • メカニズム (プラグイン・サブタイプ)
    これらのパラメーターに加えて、プラグインは、ldap_plugin_pblock_get() を使用して以下のような情報も取得できます。
    • プラグイン構成情報 (つまり、ARGC 形式と ARGV 形式で提供される構成情報)
    • ターゲット LDAP サーバーのホスト名
  4. プラグインは、メカニズム固有のロジックを実行します。 SASL プラグインとして実装できるいくつかのサンプル・メカニズムには、以下のものがあります。 これらは、システムで実行されているすべての LDAP アプリケーションで使用可能にできます。
    ユーザー指紋に基づく認証 (例えば、mechanism=userfp)
    指紋プラグインがコントロールを取得すると、ldap_sasl_bind_s() API で提供された DN を使用して、ユーザー指紋のイメージを取得します。 この認証により、ユーザーに指紋スキャン・デバイスを使用するように求めるプロンプトを出すことができます。 ただしこの例では、取得された指紋イメージはユーザー資格情報を表しています。
    資格情報が取得されると、プラグインは実際の SASL バインドを実行する準備が整います。 この認証は、ldap_plugin_sasl_bind_s() APIを呼び出し、適切なパラメーター (DN、資格情報、メカニズム、サーバー・コントロール) を提供することによって実行されます。 このAPIは、SASL バインド要求を LDAP サーバーに送信する同期 API です。 サーバーからバインド結果が返されると 2 つの項目がプラグインに返され、コントロールがプラグインに返されます。
    • バインド結果のエラー・コード
    • サーバー資格情報

    サーバー資格情報をアプリケーションに返す場合は、LDAP ライブラリーにコントロールを返す前、およびアプリケーションにコントロールを返した後に、それらの資格情報を pblock で設定する必要があります。 この設定を行うには、ldap_plugin_pblock_set() を使用します。 この例では、プラグインは、処理を完了してコントロールを返し、バインド結果のエラー・コードを戻りコードとして提供します。

    オペレーティング・システムによって以前に確立された資格情報を使用した認証
    プラグインがコントロールを取得すると、ローカル・セキュリティー・コンテキストを照会して、ユーザー ID とセキュリティー・トークンを取得します。 この例では、ローカル・セキュリティー・コンテキストに関連付けられているユーザー ID が DN の構成に使用されると仮定しています。 セキュリティー・トークンからの情報が、資格情報に使用されます。

    資格情報を取得した後、プラグインは ldap_plugin_sasl_bind_s() を呼び出し、適切なパラメーター (DN、資格情報、メカニズム、サーバー・コントロール) を提供します。 前の例と同様に、プラグインはバインド要求の結果を待ってから LDAP ライブラリーにコントロールを返し、該当する場合は、pblock にサーバー資格情報を再度設定します。 その後、コントロールはオプションのサーバー資格情報と一緒にアプリケーションに返されます。

    複数のバインドを使用した認証 (mechanism=DIGEST-MD5)
    一部の SASL メカニズムでは、クライアントとサーバーの間で複数のトランザクションが必要です (例えば、SASL DIGEST-MD5 メカニズム)。 このタイプのメカニズムでは、プラグインがコントロールを取得すると、実際に ldap_plugin_sasl_bind_s() API を複数回呼び出します。 バインド操作ごとに、プラグインは DN、資格情報、メカニズム、およびサーバー・コントロールを提供でき、これらはサーバーに渡されます。 LDAP サーバーは、結果とサーバー資格情報をクライアントに返すことができます。 プラグインは、この情報を使用して別のバインドを作成し、ldap_plugin_sasl_bind_s() を使用してサーバーに再送信することができます。 複数バインド・フローが完了すると、プラグインは、結果とオプションのサーバー資格情報と一緒にコントロールを LDAP ライブラリーに返します。