次の方法で共有


AcceptSecurityContext (Schannel) 関数

AcceptSecurityContext (Schannel) 関数を使用すると、トランスポート アプリケーションのサーバー コンポーネントで、サーバーとリモート クライアントの間にセキュリティ コンテキストを確立できます。 リモート クライアントは InitializeSecurityContext (Schannel) 関数を使用して 、セキュリティ コンテキストを確立するプロセスを開始します。 サーバーは、 セキュリティ コンテキストの確立を完了するためにリモート クライアントから 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     ptsTimeStamp
);

パラメーター

phCredential[in, optional]

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

phContext[in, out, optional]

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

警告

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

pInput[in, optional]

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

Schannel セキュリティ サポート プロバイダー (SSP) を使用する場合、最初のバッファーはSECBUFFER_TOKEN型で、クライアントから受信したセキュリティ トークンを含む必要があります。 2 番目のバッファーは、SECBUFFER_EMPTY型である必要があります。

fContextReq[in]

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

価値 意味
ASC_REQ_ALLOCATE_MEMORY ダイジェストと Schannel によって出力バッファーが割り当てられます。 出力バッファーの使用が完了したら、 FreeContextBuffer 関数を呼び出して解放します。
ASC_REQ_CONFIDENTIALITY メッセージを暗号化および復号化します。
Digest SSP は SASL に対してのみこのフラグをサポートします。
ASC_REQ_CONNECTION セキュリティ コンテキストでは、書式設定メッセージは処理されません。
ASC_REQ_EXTENDED_ERROR エラーが発生すると、リモート パーティに通知されます。
ASC_REQ_MUTUAL_AUTH クライアントは、クライアント認証に使用する証明書を提供する必要があります。
ASC_REQ_REPLAY_DETECT 再生されたパケットを検出します。
ASC_REQ_SEQUENCE_DETECT シーケンス外で受信したメッセージを検出します。
ASC_REQ_STREAM ストリーム指向接続をサポートします。
このフラグは、Schannel でのみサポートされます。

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

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

TargetDataRep[in]

このパラメーターは Schannel では使用されません。 このパラメーターには 0 を指定します。

phNewContext[in, out, optional]

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

pOutput[in, out, optional]

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

出力時に、このバッファーは セキュリティ コンテキストのトークンを受け取ります。 トークンをクライアントに送信する必要があります。 この関数は、SECBUFFER_EXTRA タイプのバッファを返すこともできます。 さらに、呼び出し元は 、SECBUFFER_ALERT型のバッファーを渡す必要があります。 出力時にアラートが生成されると、このバッファーにそのアラートに関する情報が格納され、関数は失敗します。

pfContextAttr[out]

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

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

ptsTimeStamp[out, optional]

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

これは、Schannel SSP を使用する場合は省略可能です。 リモート パーティが認証に使用する証明書を指定すると、このパラメーターはその証明書の有効期限を受け取ります。 証明書が指定されていない場合は、最大時間値が返されます。

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

戻り値

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

リターンコード/値説明
SEC_E_INCOMPLETE_MESSAGE
0x80090318L
関数は成功しました。 入力バッファ内のデータが不完全です。 アプリケーションは、クライアントから追加のデータを読み取り、[AcceptSecurityContext (Schannel)](acceptsecuritycontext--schannel.md) をもう一度呼び出す必要があります。
この値が返されると、pInput バッファーには、BufferType メンバーが SECBUFFER_MISSING の [SecBuffer](/windows/win32/api/sspi/ns-sspi-secbuffer) 構造体が含まれますSecBuffercbBuffer メンバーには、この関数が成功する前に関数がクライアントから読み取る必要がある追加バイト数を示す値が含まれています。 この数値は常に正確であるとは限りませんが、この関数を複数回呼び出すのを避けることで、この数値を使用するとパフォーマンスに役立ちます。
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 パラメータで指定された資格情報ハンドルが無効です。 この値は、Digest または Schannel SSP を使用する場合に返すことができます。
SEC_E_OK
0x00000000L
関数は成功しました。 [*セキュリティ コンテキスト*](..クライアントから受信した /secgloss/s-gly.md) が受け入れられました。 関数によって出力トークンが生成された場合は、それをクライアント プロセスに送信する必要があります。
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
関数が失敗しました。 fContextReq パラメーターに無効なコンテキスト属性フラグ (ASC_REQ_DELEGATEまたはASC_REQ_PROMPT_FOR_CREDS) が指定されました。
SEC_E_APPLICATION_PROTOCOL_MISMATCH
0x80090367L
クライアントとサーバーの間に共通のアプリケーション プロトコルが存在しません。
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
関数は成功しました。 サーバーは [CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken) を呼び出し、出力トークンをクライアントに渡す必要があります。 その後、サーバーはクライアントからのリターン トークンを待機し、[AcceptSecurityContext (Schannel)](acceptsecuritycontext--schannel.md) を別の呼び出しを行います。
SEC_I_COMPLETE_NEEDED
0x00090313L
関数は成功しました。 サーバーは、クライアントからのメッセージの作成を完了し、[CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken) 関数を呼び出す必要があります。
SEC_I_CONTINUE_NEEDED
0x00090312L
関数は成功しました。 サーバーは出力トークンをクライアントに送信し、返されるトークンを待機する必要があります。 返されたトークンは、[AcceptSecurityContext (Schannel)](acceptsecuritycontext--schannel.md) への別の呼び出しのために pInput で渡す必要があります。
STATUS_LOGON_FAILURE
0xC000006DL
関数が失敗しました。 [AcceptSecurityContext (Schannel)](acceptsecuritycontext--schannel.md) 関数は、指定したコンテキストが確立された後に呼び出されました。 この値は、Digest SSP を使用するときに返すことができます。

注釈

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

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

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

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

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

pfContextAttr パラメータは、どの正常な戻り値でも有効ですが、コンテキストのセキュリティ面に関するフラグを調べる必要があるのは、最終的に正常に戻ったときのみです。 中間の戻り値は、たとえば、ISC_RET_ALLOCATED_MEMORY フラグを設定できます。

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

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

必要条件

要件 価値
サポートされる最小クライアント Windows 8.1 [デスクトップ アプリのみ]
サポートされている最小サーバー Windows Server 2012 R2 [デスクトップ アプリのみ]
ヘッダ Sspi.h (Security.h を含む)
図書館 Secur32.lib
DLL Secur32.dll

こちらもご覧ください

SSPI 関数

DeleteSecurityContext

InitializeSecurityContext (Schannel)