AcceptSecurityContext 関数 (sspi.h)

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

構文

KSECDDDECLSPEC SECURITY_STATUS SEC_ENTRY AcceptSecurityContext(
  [in, optional]      PCredHandle    phCredential,
  [in, optional]      PCtxtHandle    phContext,
  [in, optional]      PSecBufferDesc pInput,
  [in]                unsigned long  fContextReq,
  [in]                unsigned long  TargetDataRep,
  [in, out, optional] PCtxtHandle    phNewContext,
  [in, out, optional] PSecBufferDesc pOutput,
  [out]               unsigned long  *pfContextAttr,
  [out, optional]     PTimeStamp     ptsExpiry
);

パラメーター

[in, optional] phCredential

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

[in, optional] phContext

CtxtHandle 構造体へのポインター。 AcceptSecurityContext (CredSSP) の最初の呼び出しでは、このポインターは NULL です。 後続の呼び出しでは、 phContext は、最初の呼び出しによって phNewContext パラメーターで返される部分形式のコンテキストを指定します。

[in, optional] pInput

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

最初のバッファーは SECBUFFER_TOKEN 型で、クライアントから受信したセキュリティ トークンを含んでいる必要があります。 2 番目のバッファーは SECBUFFER_EMPTY 型である必要があります。

[in] fContextReq

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

説明
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 パラメーターを参照してください。

[in] TargetDataRep

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

[in, out, optional] phNewContext

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

[in, out, optional] pOutput

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

出力時に、このバッファーはセキュリティ コンテキストのトークンを受け取ります。 トークンはクライアントに送信する必要があります。 関数は、SECBUFFER_EXTRA型のバッファーを返すこともできます。

[out] pfContextAttr

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

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

[out, optional] ptsExpiry

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

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

戻り値

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

リターン コード/値 Description
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
0x000000000L
関数が正常に実行されました。 クライアントから受信したセキュリティ コンテキストが受け入れられました。 関数が出力トークンを生成した場合は、トークンをクライアント プロセスに送信する必要があります。
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 パラメーターは、さまざまなコンテキスト属性を表すビットマスクです。 さまざまな属性の説明については、「 コンテキスト要件」を参照してください。

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

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

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー sspi.h (Security.h を含む)
Library Secur32.lib
[DLL] Secur32.dll

関連項目

DeleteSecurityContext

InitializeSecurityContext (CredSSP)

SSPI 関数