次の方法で共有


ユーザー モードの初期化

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

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

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

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

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

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

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

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

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