AcceptSecurityContext (全般) 関数
AcceptSecurityContext (General) 関数を使用すると、トランスポート アプリケーションのサーバー コンポーネントで、サーバーとリモート クライアントの間にセキュリティ コンテキストを確立できます。 リモート クライアントは InitializeSecurityContext (General) 関数を使用して 、セキュリティ コンテキストを確立するプロセスを開始します。 サーバーは、 セキュリティ コンテキストの確立を完了するために、リモート クライアントから 1 つ以上の応答トークンを要求できます。
特定の セキュリティ サポート プロバイダー (SSP) でこの関数を使用する方法については、次のトピックを参照してください。
トピック | 説明 |
---|---|
AcceptSecurityContext (CredSSP) | トランスポート アプリケーションのサーバー コンポーネントで、資格情報セキュリティ サポート プロバイダー (CredSSP) を使用して、サーバーとリモート クライアントの間にセキュリティ コンテキスト を確立できるようにします。 |
AcceptSecurityContext (Digest) | トランスポート アプリケーションのサーバー コンポーネントが、ダイジェストを使用しているサーバーとリモート クライアントの間に セキュリティ コンテキスト を確立できるようにします。 |
AcceptSecurityContext (Kerberos) | トランスポート アプリケーションのサーバー コンポーネントが、Kerberos を使用しているサーバーとリモート クライアントの間に セキュリティ コンテキスト を確立できるようにします。 |
AcceptSecurityContext (ネゴシエート) | トランスポート アプリケーションのサーバー コンポーネントが、ネゴシエートを使用しているサーバーとリモート クライアントの間に セキュリティ コンテキスト を確立できるようにします。 |
AcceptSecurityContext (NTLM) | トランスポート アプリケーションのサーバー コンポーネントが、NTLM を使用しているサーバーとリモート クライアントの間に セキュリティ コンテキスト を確立できるようにします。 |
AcceptSecurityContext (Schannel) | トランスポート アプリケーションのサーバー コンポーネントが、Schannel を使用しているサーバーとリモート クライアントの間に セキュリティ コンテキスト を確立できるようにします。 |
構文
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 (General) 関数を呼び出して、このハンドルを取得します。
phContext[in, out]
CtxtHandle 構造体へのポインター。
AcceptSecurityContext (General) の最初の呼び出しでは、このポインターは ですNULL
。 後続の呼び出しでは、 phContext は、最初の呼び出しによって phNewContext パラメーターで返された部分形式のコンテキストへのハンドルです。
警告
AcceptSecurityContext (General) の同時呼び出しでは、同じコンテキスト ハンドルを使用しないでください。 セキュリティ サービス プロバイダーの API 実装はスレッド セーフではありません。
pInput[in, optional]
入力バッファー記述子を含む InitializeSecurityContext (General) のクライアント呼び出しによって生成される SecBufferDesc 構造体へのポインター。
Schannel SSP を使用する場合、最初のバッファーは SECBUFFER_TOKEN 型で、クライアントから受信したセキュリティ トークンを含んでいる必要があります。 2 番目のバッファーは、SECBUFFER_EMPTY型である必要があります。
Negotiate、Kerberos、または NTLM SSP を使用する場合、InitializeSecurityContext (General) 関数の呼び出しによって生成されたバッファーに加えて、SECBUFFER_CHANNEL_BINDINGS型の SecBuffer 構造体を渡すことによって、チャネル バインド情報を指定できます。 チャネル バインド バッファーのチャネル バインド情報は、認証に使用されるクライアントの Schannel コンテキストで QueryContextAttributes (Schannel) 関数を呼び出すことによって取得できます。
fContextReq[in]
サーバーがコンテキストを確立するために必要な属性を指定するビット フラグ。 ビット フラグは、ビットごとの OR 演算を使用して結合できます。 このパラメーターには、次の 1 つ以上の値を指定できます。
値 | 意味 |
---|---|
ASC_REQ_ALLOCATE_MEMORY | ダイジェストと Schannel によって出力バッファーが割り当てられます。 出力バッファーの使用が完了したら、 FreeContextBuffer 関数を呼び出して解放します。 |
ASC_REQ_ALLOW_MISSING_BINDINGS | ダイジェストで、内部チャネルと外部チャネルの両方にチャネル バインドが必要ないことを示します。 この値は、エンドポイント チャネル バインドのサポートが不明な場合に、下位互換性のために使用されます。 この値は 、ASC_REQ_PROXY_BINDINGSと相互に排他的です。 この値は、Digest SSP でのみサポートされます。 Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: この値はサポートされていません。 |
ASC_REQ_CONFIDENTIALITY | メッセージの暗号化と暗号化解除。 Digest SSP では、SASL に対してのみこのフラグがサポートされます。 |
ASC_REQ_CONNECTION | セキュリティ コンテキストでは、書式設定メッセージは処理されません。 |
ASC_REQ_DELEGATE | サーバーは、クライアントの偽装を許可されます。 Kerberos に対して有効です。 制約付き委任の場合は、このフラグを無視します。 |
ASC_REQ_EXTENDED_ERROR | エラーが発生すると、リモート パーティに通知されます。 |
ASC_REQ_HTTP (0x10000000) | HTTP のダイジェストを使用します。 SASL メカニズムとしてダイジェストを使用するには、このフラグを省略します。 |
ASC_REQ_INTEGRITY | メッセージに署名し、署名を確認します。 Schannel では、このフラグはサポートされていません。 |
ASC_REQ_MUTUAL_AUTH | クライアントは、クライアント認証に使用する証明書を指定する必要があります。 このフラグは、Schannel でのみサポートされています。 |
ASC_REQ_PROXY_BINDINGS | Digest にチャネル バインドが必要であることを示します。 この値は 、ASC_REQ_ALLOW_MISSING_BINDINGSと相互に排他的です。 この値は、Digest SSP でのみサポートされます。 Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: この値はサポートされていません。 |
ASC_REQ_REPLAY_DETECT | 再生されたパケットを検出します。 |
ASC_REQ_SEQUENCE_DETECT | 受信したメッセージを順番に検出します。 |
ASC_REQ_STREAM | ストリーム指向接続をサポートします。 このフラグは、Schannel でのみサポートされています。 |
使用できる属性フラグとその意味については、「 コンテキストの要件」を参照してください。 このパラメーターに使用されるフラグの前には、ASC_REQ (たとえば、ASC_REQ_DELEGATE) が付けられます。
要求された属性は、クライアントでサポートされていない可能性があります。 詳細については、 pfContextAttr パラメーターを参照してください。
TargetDataRep[in]
ターゲットのデータ表現 (バイト順序など)。 このパラメーターには、SECURITY_NATIVE_DREPまたはSECURITY_NETWORK_DREPを指定できます。
このパラメーターは、Schannel または Digest SSP では使用されません。 Schannel または Digest SSP を使用する場合は、このパラメーターに 0 を指定します。
phNewContext[in, out, optional]
CtxtHandle 構造体へのポインター。
AcceptSecurityContext (General) の最初の呼び出しで、このポインターは新しいコンテキスト ハンドルを受け取ります。 後続の呼び出しでは、 phNewContext は phContext パラメーターで指定されたハンドルと同じにすることができます。
phNewContext を にしないでください NULL
。
pOutput[in, out, optional]
出力バッファー記述子を含む SecBufferDesc 構造体へのポインター。 このバッファーは、 InitializeSecurityContext (General) への追加の呼び出しへの入力のためにクライアントに送信されます。 関数がSEC_E_OKを返した場合でも、出力バッファーが生成される場合があります。 生成されたバッファーは、クライアント アプリケーションに返送する必要があります。
Schannel を使用する場合、出力時に、このバッファーは セキュリティ コンテキストのトークンを受け取ります。 トークンはクライアントに送信する必要があります。 関数は、SECBUFFER_EXTRA型のバッファーを返すこともできます。 さらに、呼び出し元は SECBUFFER_ALERT 型のバッファーを渡す必要があります。 出力時に、アラートが生成された場合、このバッファーにはそのアラートに関する情報が含まれており、関数は失敗します。
pfContextAttr[out]
確立されたコンテキストの属性を示すビット フラグのセットを受け取る変数へのポインター。 さまざまな属性の説明については、「 コンテキスト要件」を参照してください。 このパラメーターに使用されるフラグの前には、ASC_RET (たとえば、ASC_RET_DELEGATE) が付けられます。
最後の関数呼び出しが正常に返されるまで、セキュリティ関連の属性をチェックしないでください。 セキュリティに関連しない属性フラグ (ASC_RET_ALLOCATED_MEMORY フラグなど) は、最終的な戻り値の前に確認できます。
ptsTimeStamp[out, optional]
コンテキストの有効期限を受け取る TimeStamp 構造体へのポインター。 セキュリティ パッケージでは、常にローカル時刻にこの値を返すようにお勧めします。
このパラメーターは、一定の最大時間に設定されます。 ダイジェスト セキュリティ コンテキストまたは資格情報、または Digest SSP を使用する場合の有効期限はありません。
Schannel SSP を使用する場合、これは省略可能です。 リモート パーティが認証に使用する証明書を指定すると、このパラメーターはその証明書の有効期限を受け取ります。 証明書が指定されていない場合は、最大時間値が返されます。
注意
認証プロセスの最後の呼び出しまで、ネゴシエーションの後の段階で詳細情報が提供されるため、コンテキストの有効期限が正しくない可能性があります。 したがって、 ptsTimeStamp は関数の最後の呼び出しまでである NULL
必要があります。
戻り値
この関数は、次のいずれかの値を返します。
リターン コード/値 | 説明 |
---|---|
| 関数が失敗しました。 チャネル バインド ポリシーが満たされませんでした。 |
| 関数が正常に実行されました。 入力バッファー内のデータが不完全です。 アプリケーションは、クライアントから追加のデータを読み取り、[AcceptSecurityContext (General)](acceptsecuritycontext--general.md) をもう一度呼び出す必要があります。 この値は、Schannel SSP を使用するときに返すことができます。 この戻り値の詳細については、「AcceptSecurityContext (Schannel)](acceptsecuritycontext--schannel.md)」を参照してください。 |
| 関数が失敗しました。 要求されたアクションを完了するのに十分なメモリがありません。 |
| 関数が失敗しました。 SSPI エラー コードにマップされないエラーが発生しました。 |
| 関数が失敗しました。 関数に渡されたハンドルが無効です。 |
| 関数が失敗しました。 関数に渡されたトークンが無効です。 |
| ログオンに失敗しました。 |
| 関数が失敗しました。 認証のために機関に連絡できませんでした。 これは、次の条件が原因である可能性があります。
|
| 関数が失敗しました。
phCredential パラメーターで指定された資格情報ハンドルが無効です。 この値は、Digest または Schannel SSP を使用する場合に返すことができます。 |
| 関数が正常に実行されました。 [*セキュリティ コンテキスト*](..クライアントから受信した /secgloss/s-gly.md) が受け入れられました。 関数によって出力トークンが生成された場合は、クライアント プロセスに送信する必要があります。 |
| 関数が失敗しました。 無効なコンテキスト属性フラグが fContextReq パラメーターで指定されました。 この値は、Digest SSP を使用するときに返すことができます。 |
| 関数が失敗しました。
fContextReq パラメーターで無効なコンテキスト属性フラグ (ASC_REQ_DELEGATEまたはASC_REQ_PROMPT_FOR_CREDS) が指定されました。 この値は、Schannel SSP を使用するときに返すことができます。 |
| 関数が正常に実行されました。 サーバーは [CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken) を呼び出し、出力トークンをクライアントに渡す必要があります。 次に、サーバーはクライアントからの戻りトークンを待機し、[AcceptSecurityContext (General)](acceptsecuritycontext--general.md) を別の呼び出しで呼び出します。 |
| 関数が正常に実行されました。 サーバーは、クライアントからのメッセージの作成を完了し、[CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken) 関数を呼び出す必要があります。 |
| 関数が正常に実行されました。 サーバーは出力トークンをクライアントに送信し、返されたトークンを待機する必要があります。 [AcceptSecurityContext (General)](acceptsecuritycontext--general.md) への別の呼び出しのために、返されたトークンを pInput で渡す必要があります。 |
| 関数が失敗しました。 [AcceptSecurityContext (General)](acceptsecuritycontext--general.md) 関数は、指定したコンテキストが確立された後に呼び出されました。 この値は、Digest SSP を使用するときに返すことができます。 |
解説
AcceptSecurityContext (General) 関数は、InitializeSecurityContext (General) 関数に対応するサーバーです。
サーバーがクライアントから要求を受信すると、サーバーは fContextReq パラメーターを使用して、セッションに必要なものを指定します。 この方法では、サーバーは、クライアントが機密または 整合性チェック セッションを使用できる必要があることを指定でき、その要求を満たすことができないクライアントを拒否できます。 または、サーバーで何も要求する必要はありません。また、クライアントが提供できる内容や必要なものは、 pfContextAttr パラメーターで返されます。
相互認証などの複数区間認証をサポートするパッケージの場合、呼び出しシーケンスは次のようになります。
- クライアントはトークンをサーバーに送信します。
- サーバーは AcceptSecurityContext (General) を初めて呼び出し、応答トークンを生成してクライアントに送信します。
- クライアントはトークンを受け取り、 InitializeSecurityContext (General) に渡します。 InitializeSecurityContext (General) がSEC_E_OKを返す場合は、相互認証が完了し、セキュリティで保護されたセッションを開始できます。 InitializeSecurityContext (General) からエラー コードが返された場合、相互認証ネゴシエーションは終了します。 それ以外の場合は、 InitializeSecurityContext (General) によって返されるセキュリティ トークンがクライアントに送信され、手順 2 と 3 が繰り返されます。
- AcceptSecurityContext (General) の同時呼び出しでは phContext 値を使用しないでください。 セキュリティ プロバイダーの実装はスレッド セーフではありません。
fContextReq パラメーターと pfContextAttr パラメーターは、さまざまなコンテキスト属性を表すビットマスクです。 さまざまな属性の説明については、「 コンテキスト要件」を参照してください。
注意
pfContextAttr パラメーターは、成功した戻り値に対して有効ですが、最終的に成功した戻り時にのみ、コンテキストのセキュリティ側面に関連するフラグを調べる必要があります。 中間の戻り値は、たとえば、ISC_RET_ALLOCATED_MEMORY フラグを設定できます。
呼び出し元は、最終的なコンテキスト属性で十分かどうかを判断します。 たとえば、機密性 (暗号化) が要求されたが、確立できなかった場合、一部のアプリケーションは接続を直ちにシャットダウンすることを選択する場合があります。 セキュリティ コンテキストを確立できない場合、サーバーは DeleteSecurityContext 関数を呼び出して、部分的に作成されたコンテキストを解放する必要があります。 DeleteSecurityContext 関数を呼び出すタイミングについては、「DeleteSecurityContext」を参照してください。
セキュリティ コンテキストが確立されると、サーバー アプリケーションは QuerySecurityContextToken 関数を使用して、クライアント証明書がマップされたユーザー アカウントへのハンドルを取得できます。 また、サーバーは ImpersonateSecurityContext 関数を使用してユーザーを偽装することもできます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ] |
Header | Sspi.h (Security.h を含む) |
ライブラリ | Secur32.lib |
[DLL] | Secur32.dll |