Share via


ユーザー モードの初期化

分散 (クライアント/サーバー) アプリケーションでは、 セキュリティ パッケージ を使用して認証された接続を取得し、メッセージを交換します。 アプリケーションは、 SSP/AP によって実装される関数と、ユーザー モード SSP/AP によって実装される関数にマップされるセキュリティ サポート プロバイダー インターフェイス ( SSPI) 関数を呼び出します。 このマッピングは、クライアントとサーバーのプロセスに動的に読み込むことができるセキュリティ プロバイダー DLL (Secur32.dllまたはSecurity.dll) によって実行されます。 DLL は、Secur32.lib を使用して静的にリンクすることもできます。 DLL と LIB の両方が Microsoft Windows ソフトウェア開発キット (SDK) に付属しています。

セキュリティ パッケージを含む SSP/AP DLL が適切に登録されている場合、クライアントまたはサーバーのプロセスへのセキュリティ パッケージの読み込みはシステムによって処理されます。

サーバーは、ポートを監視し、クライアントがメッセージを送信するのを待って、クライアントとのセキュリティで保護された接続を取得するプロセスを開始します。 クライアントは、SSPI 関数 InitializeSecurityContext (General) を呼び出して、サーバーへのセキュリティで保護された接続を取得するプロセスを開始します。 この関数は、カスタム セキュリティ パッケージの SpInitLsaModeContext 関数にマップされます。 SpInitLsaModeContext は、トークンをサーバーに転送するクライアントにトークンを返します。

クライアントからトークンを受信すると、サーバーは SSPI 関数 AcceptSecurityContext (General) を呼び出します。これは、セキュリティ パッケージの SpAcceptLsaModeContext 関数にディスパッチされます。 SpAcceptLsaModeContext 関数が成功し、セキュリティ コンテキストを確立するためにこれ以上の処理が必要ない場合、関数は呼び出し元にSTATUS_SUCCESSを返す必要があります。 追加の処理が必要な場合、関数は SEC_I_CONTINUE_NEEDEDを返し、トークンをサーバーに返す必要があります。 サーバーは、 InitializeSecurityContext (General) を再度呼び出すクライアントにトークンを転送します。

この呼び出しサイクルは、認証された接続が確立されるか失敗するまで、必要に応じて繰り返される場合があります。 このプロセス中に、 SpAcceptLsaModeContext または SpInitLsaModeContext 関数が成功し、 セキュリティ コンテキストを確立するためにこれ以上の処理が必要ない場合、関数は呼び出し元にSTATUS_SUCCESSを返す必要があります。 追加の処理が必要な場合、関数は SEC_I_CONTINUE_NEEDEDを返し、呼び出し元にトークンを返す必要があります。このトークンは、転送を担当する呼び出し元に返されます。

セキュリティ パッケージによって実装されるプロトコルによって、このサイクルが繰り返される回数が決まります。 たとえば、3 本足の相互認証をサポートするセキュリティ パッケージでは、呼び出しシーケンスは次のようになります。

  1. クライアントは InitializeSecurityContext (General) を呼び出してトークンを取得し、サーバーに送信します。 サーバーは AcceptSecurityContext (General) を初めて呼び出し、クライアントに送信する応答トークンを取得します。
  2. クライアントは InitializeSecurityContext (General) の 2 回目の呼び出しでサーバーから受信したトークンを使用し、最終的なトークンを取得します。 クライアントは、このトークンをサーバーに送信します。
  3. サーバーは、 AcceptSecurityContext (General) の最後の呼び出しで使用する、レッグ 2 で生成されたトークンを受け取ります。

SpAcceptLsaModeContext 関数と SpInitLsaModeContext 関数が成功し、セキュリティ コンテキストを確立するためにこれ以上の処理が必要ない場合、関数は呼び出し元にSTATUS_SUCCESSを返す必要があります。 さらに、カスタム セキュリティ パッケージでユーザー モード SSP/AP によって実装される関数がサポートされている場合、SpAcceptLsaModeContextSpInitLsaModeContextMappedContext パラメーターを使用して TRUE を返す必要があります。 MappedContext 値はアプリケーションに返されません。LSA によってインターセプトされます。

MappedContexttrue の場合、LSA は SSP/AP DLL の SpUsermodeInitialize 関数を呼び出します。 この関数は、各セキュリティ パッケージによって実装されるユーザー モード関数へのポインターのテーブルを提供します。 SpUsermodeInitialize によって返される関数テーブルを使用して、各パッケージの SpInstanceInit 関数が呼び出されます。 SpInstanceInit は、 ユーザー モード SSP/AP によって呼び出される LSA 関数へのポインターのテーブルを受け取ります。