次の方法で共有


AcceptSecurityContext (Kerberos) 関数

AcceptSecurityContext (Kerberos) 関数を使用すると、トランスポート アプリケーションのサーバー コンポーネントで、サーバーとリモート クライアントの間にセキュリティ コンテキストを確立できます。 リモート クライアントは InitializeSecurityContext (Kerberos) 関数を使用して 、セキュリティ コンテキストを確立するプロセスを開始します。 サーバーは、 セキュリティ コンテキストの確立を完了するために、リモート クライアントから 1 つ以上の応答トークンを要求できます。

構文

SECURITY_STATUS SEC_Entry AcceptSecurityContext(
  _In_opt_    PCredHandle    phCredential,
  _In_opt_    PCtxtHandle    phContext,
  _In_opt_    PSecBufferDesc pInput,
  _In_        ULONG          fContextReq,
  _In_        ULONG          TargetDataRep,
  _Inout_opt_ PCtxtHandle    phNewContext,
  _Inout_opt_ PSecBufferDesc pOutput,
  _Out_       PULONG         pfContextAttr,
  _Out_opt_   PTimeStamp     ptsExpiry
);

パラメーター

phCredential[in, optional]

サーバーの資格情報のハンドル。 サーバーは、このハンドルを取得するために SECPKG_CRED_INBOUND または SECPKG_CRED_BOTH フラグを設定して AcquireCredentialsHandle (Kerberos) 関数を呼び出します。

phContext[in, out, optional]

CtxtHandle 構造体へのポインター。 AcceptSecurityContext (Kerberos) の最初の呼び出しでは、このポインターは ですNULL。 後続の呼び出しでは、 phContext は、最初の呼び出しによって phNewContext パラメーターで返された部分的に形成されたコンテキストへのハンドルです。

警告

AcceptSecurityContext (Kerberos) の同時呼び出しでは、同じコンテキスト ハンドルを使用しないでください。 セキュリティ サービス プロバイダーの API 実装はスレッド セーフではありません。

pInput[in, optional]

入力バッファー記述子を含む InitializeSecurityContext (Kerberos) のクライアント呼び出しによって生成される SecBufferDesc 構造体へのポインター。

チャネル バインド情報は、InitializeSecurityContext (General) 関数の呼び出しによって生成されたバッファーに加えて、SECBUFFER_CHANNEL_BINDINGS型の SecBuffer 構造体を渡すことによって指定できます。 チャネル バインド バッファーのチャネル バインド情報を取得するには、認証に使用するクライアントの Schannel コンテキストで QueryContextAttributes (Schannel) 関数を呼び出します。

fContextReq[in]

サーバーがコンテキストを確立するために必要な属性を指定するビット フラグ。 ビット フラグは、ビットごとの OR 演算を使用して組み合わせることができます。 このパラメーターには、次の値の 1 つ以上を指定できます。

意味
ASC_REQ_CONFIDENTIALITY メッセージの暗号化と暗号化解除。
ASC_REQ_CONNECTION セキュリティ コンテキストでは、書式設定メッセージは処理されません。
ASC_REQ_DELEGATE サーバーはクライアントの権限を借用できます。 Kerberos に対して有効です。 制約付き委任の場合は、このフラグを無視します。
ASC_REQ_EXTENDED_ERROR エラーが発生すると、リモート パーティに通知されます。
ASC_REQ_INTEGRITY メッセージに署名し、署名を確認します。
ASC_REQ_REPLAY_DETECT 再生されたパケットを検出します。
ASC_REQ_SEQUENCE_DETECT 受信したメッセージを順番に検出します。

可能な属性フラグとその意味については、「 コンテキスト要件」を参照してください。 このパラメーターに使用されるフラグには、ASC_REQ (たとえば、ASC_REQ_DELEGATE) がプレフィックスとして付けられます。

要求された属性は、クライアントでサポートされていない可能性があります。 詳細については、 pfContextAttr パラメーターを参照してください。

TargetDataRep[in]

ターゲット上のバイト順序などのデータ表現。 このパラメーターには、SECURITY_NATIVE_DREPまたはSECURITY_NETWORK_DREPを指定できます。

phNewContext[in, out, optional]

CtxtHandle 構造体へのポインター。 AcceptSecurityContext (Kerberos) の最初の呼び出しで、このポインターは新しいコンテキスト ハンドルを受け取ります。 後続の呼び出しでは、 phNewContextphContext パラメーターで指定されたハンドルと同じにすることができます。 phNewContext をNULLしないでください。

pOutput[in, out, optional]

出力バッファー記述子を含む SecBufferDesc 構造体へのポインター。 このバッファーは、 InitializeSecurityContext (Kerberos) への追加の呼び出しへの入力のためにクライアントに送信されます。 関数がSEC_E_OKを返した場合でも、出力バッファーが生成される場合があります。 生成されたバッファーは、クライアント アプリケーションに返送する必要があります。

pfContextAttr[out]

確立されたコンテキストの属性を示すビット フラグのセットを受け取る変数へのポインター。 さまざまな属性の説明については、「 コンテキスト要件」を参照してください。 このパラメーターに使用されるフラグには、ASC_RET_DELEGATEなど、ASC_RETがプレフィックスとして付けられます。

最終的な関数呼び出しが正常に返されるまで、セキュリティ関連の属性をチェックしないでください。 セキュリティに関連しない属性フラグ (ASC_RET_ALLOCATED_MEMORY フラグなど) は、最終的な戻り値の前に確認できます。

ptsTimeStamp[out, optional]

コンテキストの有効期限を受け取る TimeStamp 構造体へのポインター。 セキュリティ パッケージでは、常にローカル時刻にこの値を返すようにお勧めします。

注意

認証プロセスの最後の呼び出しまで、ネゴシエーションの後の段階で詳細情報が提供されるため、コンテキストの有効期限が正しくない可能性があります。 したがって、 ptsTimeStamp は、関数の最後の呼び出しまでである NULL 必要があります。

戻り値

この関数は、次のいずれかの値を返します。

リターン コード/値 説明
SEC_E_INSUFFICIENT_MEMORY
0x80090300L
関数が失敗しました。 要求されたアクションを完了するのに十分なメモリがありません。
SEC_E_INTERNAL_ERROR
0x80090304L
関数が失敗しました。 SSPI エラー コードにマップされないエラーが発生しました。
SEC_E_INVALID_HANDLE
0x80100003L
関数が失敗しました。 関数に渡されたハンドルが無効です。
SEC_E_INVALID_TOKEN
0x80090308L
関数が失敗しました。 関数に渡されたトークンが無効です。
SEC_E_LOGON_DENIED
0x8009030CL
ログオンに失敗しました。
SEC_E_NO_AUTHENTICATING_AUTHORITY
0x80090311L
関数が失敗しました。 認証のために機関に問い合わせることができませんでした。 これは、次の条件が原因である可能性があります。
-認証側のドメイン名が正しくありません。
-ドメインは使用できません。
-信頼関係が失敗しました。
SEC_E_OK
0x00000000L
関数が正常に実行されました。 クライアントから受信した セキュリティ コンテキスト が受け入れられました。 関数によって出力トークンが生成された場合は、クライアント プロセスに送信する必要があります。
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
関数が失敗しました。 fContextReq パラメーターで無効なコンテキスト属性フラグ (ASC_REQ_DELEGATEまたはASC_REQ_PROMPT_FOR_CREDS) が指定されました。 この値は、Schannel SSP を使用するときに返すことができます。
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
関数が正常に実行されました。 サーバーは CompleteAuthToken を 呼び出し、出力トークンをクライアントに渡す必要があります。 その後、サーバーはクライアントからのリターン トークンを待機し、 AcceptSecurityContext (Kerberos) を別の呼び出しにします。
SEC_I_COMPLETE_NEEDED
0x00090313L
関数が正常に実行されました。 サーバーは、クライアントからのメッセージの作成を完了し、 CompleteAuthToken 関数を呼び出す必要があります。
SEC_I_CONTINUE_NEEDED
0x00090312L
関数が正常に実行されました。 サーバーは出力トークンをクライアントに送信し、返されたトークンを待機する必要があります。 返されたトークンは、AcceptSecurityContext (Kerberos) への別の呼び出しのために pInput で渡す必要があります。

解説

AcceptSecurityContext (Kerberos) 関数は、InitializeSecurityContext (Kerberos) 関数に対応するサーバーです。

サーバーがクライアントから要求を受信すると、サーバーは fContextReq パラメーターを使用して、セッションに必要なものを指定します。 この方法では、サーバーは、クライアントが機密または 整合性チェック セッションを使用できる必要があることを指定でき、その要求を満たすことができないクライアントを拒否できます。 または、サーバーで何も要求する必要はありません。また、クライアントが提供できる内容や必要なものは、 pfContextAttr パラメーターで返されます。

相互認証などの複数区間認証をサポートするパッケージの場合、呼び出しシーケンスは次のようになります。

  1. クライアントはトークンをサーバーに送信します。
  2. サーバーは AcceptSecurityContext (Kerberos) を初めて呼び出し、応答トークンを生成してクライアントに送信します。
  3. クライアントはトークンを受け取り、 InitializeSecurityContext (Kerberos) に渡します。 InitializeSecurityContext (Kerberos) がSEC_E_OKを返した場合、相互認証が完了し、セキュリティで保護されたセッションを開始できます。 InitializeSecurityContext (Kerberos) がエラー コードを返した場合、相互認証ネゴシエーションは終了します。 それ以外の場合、 InitializeSecurityContext (Kerberos) によって返されるセキュリティ トークンがクライアントに送信され、手順 2 と 3 が繰り返されます。
  4. AcceptSecurityContext (Kerberos) の同時呼び出しでは phContext 値を使用しないでください。 セキュリティ プロバイダーの実装はスレッド セーフではありません。

fContextReq パラメーターと pfContextAttr パラメーターは、さまざまなコンテキスト属性を表すビットマスクです。 さまざまな属性の説明については、「 コンテキスト要件」を参照してください。

注意

pfContextAttr パラメーターは、成功した戻り値に対して有効ですが、最終的に成功した戻り時にのみ、コンテキストのセキュリティ側面に関連するフラグを調べる必要があります。 中間の戻り値は、たとえば、ISC_RET_ALLOCATED_MEMORY フラグを設定できます。

呼び出し元は、最終的なコンテキスト属性で十分かどうかを判断します。 たとえば、機密性 (暗号化) が要求されたが、確立できなかった場合、一部のアプリケーションは接続を直ちにシャットダウンすることを選択する場合があります。 セキュリティ コンテキストを確立できない場合、サーバーは DeleteSecurityContext 関数を呼び出して、部分的に作成されたコンテキストを解放する必要があります。 DeleteSecurityContext 関数を呼び出すタイミングについては、「DeleteSecurityContext」を参照してください。

セキュリティ コンテキストが確立されると、サーバー アプリケーションは QuerySecurityContextToken 関数を使用して、クライアント証明書がマップされたユーザー アカウントへのハンドルを取得できます。 また、サーバーは ImpersonateSecurityContext 関数を使用してユーザーを偽装することもできます。

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ]
Header Sspi.h (Security.h を含む)
ライブラリ Secur32.lib
[DLL] Secur32.dll

こちらもご覧ください

SSPI 関数

DeleteSecurityContext

InitializeSecurityContext (Kerberos)