次の方法で共有


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) の最初の呼び出し時に、このポインターは新しいコンテキスト ハンドルを受け取ります。 後続の呼び出しでは、 phNewContextphContext パラメータで指定されたハンドルと同じになる場合があります。 phNewContextNULL にしないでください。

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

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

戻り値

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

リターンコード + 値 説明
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_SECURITY_QOS_FAILED
0x80090332L
関数が失敗しました。 fContextReq パラメータに無効なコンテキスト属性フラグが指定されました。
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
関数が正常に実行されました。 サーバーは CompleteAuthToken を呼び出して、出力トークンをクライアントに渡す必要があります。 次に、サーバーはクライアントからの戻りトークンを待機し、 AcceptSecurityContext (Digest)をもう一度呼び出します。
SEC_I_COMPLETE_NEEDED
0x00090313L
関数が正常に実行されました。 サーバーはクライアントからのメッセージの構築を完了してから、 CompleteAuthToken 関数を呼び出す必要があります。
SEC_I_CONTINUE_NEEDED
0x00090312L
関数が正常に実行されました。 サーバーは出力トークンをクライアントに送信し、返されるトークンを待機する必要があります。 返されたトークンは、 AcceptSecurityContext (Digest)への別の呼び出しのために pInput に渡される必要があります。
STATUS_LOGON_FAILURE
0xC000006DL
関数が失敗しました。 指定されたコンテキストが確立された後、 AcceptSecurityContext (Digest) 関数が呼び出されました。
SEC_E_BAD_BINDINGS
0x80090346L
関数が失敗しました。 チャネル バインディング ポリシーが満たされませんでした。

解説

AcceptSecurityContext (Digest) 関数は、 InitializeSecurityContext (Digest) 関数のサーバー側対応関数です。

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

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

  1. クライアントはトークンをサーバーに送信します。
  2. サーバーは最初に AcceptSecurityContext (Digest) を呼び出し、応答トークンを生成してクライアントに送信します。
  3. クライアントはトークンを受信し、それを InitializeSecurityContext (Digest)に渡します。 InitializeSecurityContext (Digest) が SEC_E_OK を返す場合、相互認証が完了し、安全なセッションを開始できます。 InitializeSecurityContext (Digest) がエラー コードを返す場合、相互認証ネゴシエーションは終了します。 それ以外の場合は、 InitializeSecurityContext (Digest) によって返されたセキュリティ トークンがクライアントに送信され、手順 2 と 3 が繰り返されます。
  4. 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

関連項目

SSPI 関数

DeleteSecurityContext

InitializeSecurityContext (Digest)