AcceptSecurityContext (CredSSP) 関数
AcceptSecurityContext (CredSSP) 関数を使用すると、トランスポート アプリケーションのサーバー コンポーネントは、サーバーとリモート クライアント間のセキュリティ コンテキストを確立できます。 リモート クライアントは、 InitializeSecurityContext (CredSSP) 関数を呼び出して、セキュリティ コンテキストを確立するプロセスを開始します。 サーバーは、セキュリティ コンテキストの確立を完了するために、リモート クライアントから 1 つ以上の応答トークンを要求する場合があります。
構文
SECURITY_STATUS SEC_ENTRY AcceptSecurityContext(
_In_opt_ PCredHandle phCredential,
_In_opt_ PCtxtHandle phContext,
_In_opt_ PSecBufferDesc pInput,
_In_ unsigned long fContextReq,
_In_ unsigned long TargetDataRep,
_Inout_opt_ PCtxtHandle phNewContext,
_Inout_opt_ PSecBufferDesc pOutput,
_Out_ unsigned long *pfContextAttr,
_Out_opt_ PTimeStamp ptsExpiry
);
パラメーター
phCredential [in, optional]
サーバー資格情報へのハンドル。 このハンドルを取得するために、サーバーは SECPKG_CRED_INBOUND または SECPKG_CRED_BOTH フラグのいずれかを設定して AcquireCredentialsHandle (CredSSP) 関数を呼び出します。
phContext [in, optional]
CtxtHandle 構造体へのポインター。 >AcceptSecurityContext (CredSSP)への最初の呼び出しでは、このポインターは NULL
です。 後続の呼び出しでは、 phContext は、最初の呼び出しによって phNewContext パラメータで返された部分的に形成されたコンテキストを指定します。
警告
AcceptSecurityContext (CredSSP) への同時呼び出しで同じコンテキスト ハンドルを使用しないでください。 セキュリティ サービス プロバイダーの API 実装はスレッド セーフではありません。
pInput [in, optional]
InitializeSecurityContext (CredSSP)へのクライアント呼び出しによって生成された SecBufferDesc 構造体へのポインター。 構造体には入力バッファ記述子が含まれます。
最初のバッファは、タイプ SECBUFFER_TOKEN であり、クライアントから受信したセキュリティ トークンが含まれている必要があります。 2番目のバッファのタイプは SEC BUFFER_EMPTYである必要があります。
fContextReq [in]
- コンテキストを確立するためにサーバーが必要とする属性を指定するビット フラグ。 ビットフラグは、ビット単位のOR 演算を使用して組み合わせることができます。 このパラメーターには、次の値のいずれかを指定できます。
Value | 意味 |
---|---|
ASC_REQ_ALLOCATE_MEMORY | 資格情報セキュリティ サポート プロバイダー (CredSSP) が出力バッファーを割り当てます。 出力バッファーの使用が完了したら、 FreeContextBuffer 関数を呼び出して解放します。 |
ASC_REQ_CONNECTION | セキュリティ コンテキスト では、書式設定メッセージは処理されません。 |
ASC_REQ_DELEGATE | サーバーはクライアントになりすますことが許可されます。 制約付き委任の場合は、このフラグを無視します。 |
ASC_REQ_EXTENDED_ERROR | エラーが発生すると、リモート パーティに通知されます。 |
ASC_REQ_REPLAY_DETECT | 再生されたパケットを検出します。 |
ASC_REQ_SEQUENCE_DETECT | シーケンス外で受信したメッセージを検出します。 |
ASC_REQ_STREAM | ストリーム指向接続をサポートします。 |
可能な属性フラグとその意味については、 コンテキスト要件を参照してください。 このパラメータに使用されるフラグには、ASC_REQ というプレフィックスが付きます (例: ASC_REQ_DELEGATE)。
要求された属性は、クライアントでサポートされていない可能性があります。 詳細については、この記事の pfContextAttr パラメーターを参照してください。
TargetDataRep [in]
ターゲット上のバイト順序などのデータ表現。 このパラメータは、 SECURITY_NATIVE_DREP または SECURITY_NETWORK_DREP のいずれかになります。
phNewContext [in, out, optional]
CtxtHandle 構造体へのポインター。 AcceptSecurityContext (CredSSP) への最初の呼び出し時に、このポインターは新しいコンテキスト ハンドルを受け取ります。 後続の呼び出しでは、 phNewContext は phContext パラメータで指定されたハンドルと同じになる場合があります。
pOutput [in, out, optional]
出力バッファ記述子を含む SecBufferDesc 構造体へのポインタ。 このバッファは、 InitializeSecurityContext (CredSSP) への追加呼び出しへの入力としてクライアントに送信されます。 関数が SEC_E_OK を返す場合でも、出力バッファが生成される場合があります。 生成されたバッファはすべてクライアント アプリケーションに送り返す必要があります。
出力時に、このバッファはセキュリティ コンテキストのトークンを受け取ります。 トークンをクライアントに送信する必要があります。 この関数は、SECBUFFER_EXTRA タイプのバッファを返すこともできます。
pfContextAttr [out]
確立されたコンテキストの属性を示すビット フラグのセットへのポインター。 さまざまな属性の説明については、「コンテキスト要件」を参照してください。 このパラメータに使用されるフラグには、ASC_RET というプレフィックスが付きます (例: ASC_RET_DELEGATE)。
最終的な関数呼び出しが正常に返されるまで、セキュリティ関連の属性をチェックしないでください。 ASC_RET_ALLOCATED_MEMORY フラグなど、セキュリティに関連しない属性フラグは、最終的な戻りの前にチェックできます。
ptsExpiry [out, optional]
コンテキストの有効期限を受け取る TimeStamp 構造体へのポインター。 セキュリティ パッケージでは、この値を常にローカル時間で返すことをお勧めします。
Note
認証プロセスの最後の呼び出しまでは、ネゴシエーションの後の段階でさらに情報が提供されるため、コンテキストの有効期限が不正確になる可能性があります。 したがって、関数の最後の呼び出しまで、 ptsTimeStamp は NULL
である必要があります。
戻り値
この関数は、次のいずれかの値を返します。
リターンコード/値 | 説明 |
---|---|
SEC_E_INCOMPLETE_MESSAGE 0x80090318L |
関数が正常に実行されました。 入力バッファ内のデータが不完全です。 アプリケーションはクライアントから追加データを読み取り、 AcceptSecurityContext (CredSSP) を再度呼び出す必要があります。 |
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_NO_CREDENTIALS 0x8009030EL |
関数が失敗しました。 phCredential パラメータで指定された資格情報ハンドルが無効です。 |
SEC_E_OK 0x00000000L |
関数が正常に実行されました。 クライアントから受信したセキュリティ コンテキストが受け入れられました。 関数が出力トークンを生成した場合、そのトークンをクライアント プロセスに送信する必要があります。 |
SEC_E_UNSUPPORTED_FUNCTION 0x80090302L |
関数が失敗しました。 fContextReq パラメータに無効なコンテキスト属性フラグ (ASC_REQ_DELEGATE または ASC_REQ_PROMPT_FOR_CREDS) が指定されました。 |
SEC_I_COMPLETE_AND_CONTINUE 0x00090314L |
関数が正常に実行されました。 サーバーは CompleteAuthToken を呼び出して、出力トークンをクライアントに渡す必要があります。 その後、サーバーは、 AcceptSecurityContext (CredSSP) への別の呼び出しを行う前に、クライアントからの戻りトークンを待機する必要があります。 |
SEC_I_COMPLETE_NEEDED 0x00090313L |
関数が正常に実行されました。 サーバーは、 CompleteAuthTokenを呼び出す前に、クライアントからのメッセージの構築を完了する必要があります。 |
SEC_I_CONTINUE_NEEDED 0x00090312L |
関数が正常に実行されました。 サーバーは出力トークンをクライアントに送信し、返されるトークンを待機する必要があります。 返されたトークンは、 AcceptSecurityContext (CredSSP)への別の呼び出しのために pInput に渡される必要があります。 |
解説
AcceptSecurityContext (CredSSP) 関数は、 InitializeSecurityContext (CredSSP) 関数のサーバー側対応関数です。
サーバーはクライアントからリクエストを受信すると、 fContextReq パラメータを使用してセッションに必要な内容を指定します。 この方法では、サーバーはクライアントが機密セッションまたは 整合性チェック済みセッションを使用できることを要求できます。また、その要求を満たすことができないクライアントを拒否できます。 あるいは、サーバーは何も要求しないこともできます。その場合、クライアントが要求するもの、または提供できるものはすべて pfContextAttr パラメータで返されます。
fContextReq および pfContextAttr パラメータは、さまざまなコンテキスト属性を表すビットマスクです。 さまざまな属性の説明については、「コンテキスト要件」を参照してください。
Note
pfContextAttr パラメータはどの正常な戻り値でも有効ですが、コンテキストのセキュリティ面に関するフラグは、最終的に正常に戻された場合にのみ調べる必要があります。 中間の戻り値は、たとえば、ISC_RET_ALLOCATED_MEMORY フラグを設定できます。
呼び出し元は、最終的なコンテキスト属性が十分かどうかを判断します。 たとえば、機密性 (暗号化) が要求されたが確立できなかった場合、一部のアプリケーションでは接続を直ちにシャットダウンすることを選択する場合があります。 セキュリティ コンテキストを確立できない場合、サーバーは DeleteSecurityContext 関数を呼び出して、部分的に作成されたコンテキストを解放する必要があります。 DeleteSecurityContext 関数を呼び出すタイミングについては、 DeleteSecurityContextを参照してください。
セキュリティ コンテキストが確立された後、サーバー アプリケーションは QuerySecurityContextToken 関数を使用して、クライアント証明書がマップされたユーザー アカウントへのハンドルを取得できます。 また、サーバーは ImpersonateSecurityContext 関数を使用してユーザーを偽装することもできます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows�Vista [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server�2008 [デスクトップアプリのみ] |
ヘッダー | Sspi.h (Security.h を含む) |
ライブラリ | Secur32.lib |
[DLL] | Secur32.dll |