AcceptSecurityContext (Digest) 関数
AcceptSecurityContext (Digest) 関数により、トランスポート アプリケーションのサーバー コンポーネントは、サーバーとリモート クライアントの間に セキュリティ コンテキスト を確立できるようになります。 リモート クライアントは、 InitializeSecurityContext (Digest) 関数を使用して、セキュリティ コンテキストを確立するプロセスを開始します。 サーバーは、セキュリティ コンテキストの確立を完了するために、リモート クライアントから 1 つ以上の応答トークンを要求する場合があります。
構文
SECURITY_STATUS SEC_Entry AcceptSecurityContext(
_In_opt_ PCredHandle phCredential,
_Inout_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 (Digest) 関数を呼び出し、このハンドルを取得します。
phContext [in, out, optional]
CtxtHandle 構造体へのポインター。 AcceptSecurityContext (Digest) への最初の呼び出しでは、このポインターは NULL
です。 後続の呼び出しでは、 phContext は、最初の呼び出しによって phNewContext パラメータで返された、部分的に形成されたコンテキストへのハンドルです。
警告
AcceptSecurityContext (Digest) への同時呼び出しで同じコンテキスト ハンドルを使用しないでください。 セキュリティ サービス プロバイダーの API 実装はスレッド セーフではありません。
pInput [in, optional]
入力バッファ記述子を含む InitializeSecurityContext (Digest) へのクライアント呼び出しによって生成された SecBufferDesc 構造体へのポインタ。
次の表は、ダイジェスト HTTP のバッファ構成を示しています。 最初のバッファは SECBUFFER_TOKENタイプである必要があり、残りのバッファは SECBUFFER_PKG_PARAMSタイプである必要があります。 SASL ではバッファ 0 のみが必要です。
バッファー #/バッファータイプ | 意味 |
---|---|
0 SECBUFFER_TOKEN |
最初の呼び出しでは空で、2 番目の呼び出しではクライアントから受信したチャレンジ応答です。 |
1 SECBUFFER_PKG_PARAMS |
メソッド。 文字はリクエスト ラインからのワイヤライン形式です。 US ASCII シングルバイト文字。 |
2 SECBUFFER_PKG_PARAMS |
予約済み。 |
3 SECBUFFER_PKG_PARAMS |
HEntity. H(エンティティ本体)の16進表現。 US ASCII シングルバイト文字。 |
4 SECBUFFER_PKG_PARAMS |
[領域]。 チャレンジのレルム文字列。 US ASCII で表現可能な Unicode 文字列。 |
5 SECBUFFER_CHANNEL_BINDINGS | SECBUFFER_READONLY |
チャネル バインディング トークンの値が含まれます。 Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP: この値はサポートされていません。 |
fContextReq [in]
コンテキストを確立するためにサーバーが必要とする属性を指定するビット フラグ。 ビットフラグは、ビット単位のOR 演算を使用して組み合わせることができます。 このパラメーターには、次の値のいずれかを指定できます。
Value | 意味 |
---|---|
ASC_REQ_ALLOCATE_MEMORY | Digest は出力バッファを割り当てます。 出力バッファーの使用が完了したら、 FreeContextBuffer 関数を呼び出して解放します。 |
ASC_REQ_ALLOW_MISSING_BINDINGS | ダイジェストでは、内部チャネルと外部チャネルの両方に対してチャネル バインディングが必要ないことを示します。 この値は、エンドポイント チャネル バインディングのサポートが不明な場合に、下位互換性のために使用されます。 この値は ASC_REQ_PROXY_BINDINGSと排他的です。 Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP: この値はサポートされていません。 |
ASC_REQ_CONFIDENTIALITY | メッセージを暗号化および復号化します。 Digest SSP は SASL に対してのみこのフラグをサポートします。 |
ASC_REQ_PROXY_BINDINGS | ダイジェストにチャネル バインディングが必要であることを示します。 この値は ASC_REQ_ALLOW_MISSING_BINDINGS と排他的です。 Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP: この値はサポートされていません。 |
ASC_REQ_CONNECTION | セキュリティ コンテキスト では、書式設定メッセージは処理されません。 |
ASC_REQ_EXTENDED_ERROR | エラーが発生すると、リモート パーティに通知されます。 |
ASC_REQ_HTTP (0x10000000) | HTTP 向けの Digest を使用します。 SASL メカニズムとしてダイジェストを使用する場合は、このフラグを省略します。 |
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 のいずれかになります。
このパラメータはダイジェスト SSP では使用されません。 Digest SSP を使用する場合は、このパラメータに 0 を指定します。
phNewContext [in, out, optional]
CtxtHandle 構造体へのポインター。 AcceptSecurityContext (Digest) の最初の呼び出し時に、このポインターは新しいコンテキスト ハンドルを受け取ります。 後続の呼び出しでは、 phNewContext は phContext パラメータで指定されたハンドルと同じになる場合があります。 phNewContext は NULL
にしないでください。
pOutput [in, out, optional]
出力バッファ記述子を含む SecBufferDesc 構造体へのポインタ。 このバッファは、 InitializeSecurityContext (Digest)への追加呼び出しへの入力としてクライアントに送信されます。 関数が SEC_E_OK を返す場合でも、出力バッファが生成される場合があります。 生成されたバッファはすべてクライアント アプリケーションに送り返す必要があります。
pfContextAttr [out]
確立されたコンテキストの属性を示すビット フラグのセットを受け取る変数へのポインター。 さまざまな属性の説明については、「コンテキスト要件」を参照してください。 このパラメータに使用されるフラグには、ASC_RET というプレフィックスが付きます (例: ASC_RET_DELEGATE)。
最終的な関数呼び出しが正常に返されるまで、セキュリティ関連の属性をチェックしないでください。 ASC_RET_ALLOCATED_MEMORY フラグなど、セキュリティに関連しない属性フラグは、最終的な戻りの前にチェックできます。
ptsTimeStamp [out, optional]
コンテキストの有効期限を受け取る TimeStamp 構造体へのポインター。 セキュリティ パッケージ では、この値を常にローカル時間で返すことをお勧めします。
このパラメータは一定の最大時間に設定されます。 ダイジェスト セキュリティ コンテキストまたは資格情報、あるいはダイジェスト SSP を使用する場合、有効期限はありません。
Note
認証プロセスの最後の呼び出しまでは、ネゴシエーションの後の段階でさらに情報が提供されるため、コンテキストの有効期限が不正確になる可能性があります。 したがって、関数の最後の呼び出しまで、 ptsTimeStamp は NULL
である必要があります。
戻り値
この関数は次のいずれかの値を返します。
リターンコード + 値 | 説明 |
---|---|
SEC_E_INSUFFICIENT_MEMORY0x80090300L |
関数が失敗しました。 要求された操作を完了するために必要なメモリが不足しています。 |
SEC_E_INTERNAL_ERROR0x80090304L |
関数が失敗しました。 SSPI エラー コードにマップされていないエラーが発生しました。 |
SEC_E_INVALID_HANDLE0x80100003L |
関数が失敗しました。 関数に渡されたハンドルが無効です。 |
SEC_E_INVALID_TOKEN0x80090308L |
関数が失敗しました。 関数に渡されたトークンが無効です。 |
SEC_E_LOGON_DENIED0x8009030CL |
ログオンに失敗しました。 |
SEC_E_NO_AUTHENTICATING_AUTHORITY0x80090311L |
関数が失敗しました。 認証のために機関に問い合わせできませんでした。 これは次の条件が原因である可能性があります。 - 認証側のドメイン名が正しくありません。 - ドメインが利用できません。 -信頼関係が崩れた。 |
SEC_E_NO_CREDENTIALS0x8009030EL |
関数が失敗しました。 phCredential パラメータで指定された資格情報ハンドルが無効です。 |
SEC_E_OK0x00000000L |
関数が正常に実行されました。 クライアントから受信した セキュリティ コンテキスト が受け入れられました。 関数によって出力トークンが生成された場合は、それをクライアント プロセスに送信する必要があります。 |
SEC_E_SECURITY_QOS_FAILED0x80090332L |
関数が失敗しました。 fContextReq パラメータに無効なコンテキスト属性フラグが指定されました。 |
SEC_I_COMPLETE_AND_CONTINUE0x00090314L |
関数が正常に実行されました。 サーバーは CompleteAuthToken を呼び出して、出力トークンをクライアントに渡す必要があります。 次に、サーバーはクライアントからの戻りトークンを待機し、 AcceptSecurityContext (Digest)をもう一度呼び出します。 |
SEC_I_COMPLETE_NEEDED0x00090313L |
関数が正常に実行されました。 サーバーはクライアントからのメッセージの構築を完了してから、 CompleteAuthToken 関数を呼び出す必要があります。 |
SEC_I_CONTINUE_NEEDED0x00090312L |
関数が正常に実行されました。 サーバーは出力トークンをクライアントに送信し、返されるトークンを待機する必要があります。 返されたトークンは、 AcceptSecurityContext (Digest)への別の呼び出しのために pInput に渡される必要があります。 |
STATUS_LOGON_FAILURE0xC000006DL |
関数が失敗しました。 指定されたコンテキストが確立された後、 AcceptSecurityContext (Digest) 関数が呼び出されました。 |
SEC_E_BAD_BINDINGS0x80090346L |
関数が失敗しました。 チャネル バインディング ポリシーが満たされませんでした。 |
解説
AcceptSecurityContext (Digest) 関数は、 InitializeSecurityContext (Digest) 関数のサーバー側対応関数です。
サーバーはクライアントから要求を受信すると、 fContextReq パラメータを使用してセッションに必要な内容を指定します。 この方法では、サーバーはクライアントが機密セッションまたは 整合性チェック済みセッションを使用できる必要があることを指定でき、その要求を満たすことができないクライアントを拒否できます。 あるいは、サーバーは何も要求せず、クライアントが提供できるものや要求するものはすべて pfContextAttr パラメータで返されます。
相互認証などの複数段階の認証をサポートするパッケージの場合、呼び出しシーケンスは次のようになります。
- クライアントはトークンをサーバーに送信します。
- サーバーは最初に AcceptSecurityContext (Digest) を呼び出し、応答トークンを生成してクライアントに送信します。
- クライアントはトークンを受信し、それを InitializeSecurityContext (Digest)に渡します。 InitializeSecurityContext (Digest) が SEC_E_OK を返す場合、相互認証が完了し、安全なセッションを開始できます。 InitializeSecurityContext (Digest) がエラー コードを返す場合、相互認証ネゴシエーションは終了します。 それ以外の場合は、 InitializeSecurityContext (Digest) によって返されたセキュリティ トークンがクライアントに送信され、手順 2 と 3 が繰り返されます。
- AcceptSecurityContext (Digest) への同時呼び出しでは、 phContext 値を使用しないでください。 セキュリティ プロバイダーの実装はスレッド セーフではありません。
fContextReq および pfContextAttr パラメータは、さまざまなコンテキスト属性を表すビットマスクです。 さまざまな属性の説明については、「コンテキスト要件」を参照してください。
Note
pfContextAttr パラメータは、どの正常な戻り値でも有効ですが、コンテキストのセキュリティ面に関するフラグを調べる必要があるのは、最終的に正常に戻ったときのみです。 中間の戻り値は、たとえば、ISC_RET_ALLOCATED_MEMORY フラグを設定できます。
呼び出し元は、最終的なコンテキスト属性が十分かどうかを判断します。 たとえば、機密性 (暗号化) が要求されたが確立できなかった場合、一部のアプリケーションでは接続を直ちにシャットダウンすることを選択する場合があります。 セキュリティ コンテキスト を確立できない場合、サーバーは DeleteSecurityContext 関数を呼び出して、部分的に作成されたコンテキストを解放する必要があります。 DeleteSecurityContext 関数を呼び出すタイミングについては、 DeleteSecurityContextを参照してください。
セキュリティ コンテキスト が確立された後、サーバー アプリケーションは QuerySecurityContextToken 関数を使用して、クライアント証明書がマップされたユーザー アカウントへのハンドルを取得できます。 また、サーバーは ImpersonateSecurityContext 関数を使用してユーザーを偽装することもできます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
ヘッダー | Sspi.h (Security.h を含む) |
ライブラリ | Secur32.lib |
[DLL] | Secur32.dll |