비동기 SSPI

비동기 SSPI 헤더에는 비동기 컨텍스트 개체를 지원하는 함수가 포함되어 있으므로 호출자는 비동기 SSPI 호출 수명 주기를 통해 서버와 원격 클라이언트 간에 보안 컨텍스트를 동시에 설정할 수 있습니다.

비동기 컨텍스트 관리 유형

개체 이름 Description
SspiAsyncNotifyCallback 비동기 SSPI 호출의 완료를 알리는 데 사용되는 콜백입니다.

비동기 컨텍스트 관리 함수

API 이름 Description
SspiCreateAsyncContext 비동기 호출을 추적하는 데 사용되는 SspiAsyncContext의 인스턴스를 만듭니다.
SspiReinitAsyncContext 다시 사용할 비동기 컨텍스트를 표시합니다.
SspiSetAsyncNotifyCallback 비동기 호출 완료 시 알림을 받은 콜백을 등록합니다.
SspiAsyncContextRequiresNotify 지정된 비동기 컨텍스트에 호출 완료 시 알림이 필요한지 여부를 결정합니다.
SspiGetAsyncCallStatus 제공된 컨텍스트와 연결된 비동기 호출의 현재 상태를 가져옵니다.
SspiFreeAsyncContext SspiCreateAsyncContext 함수 호출에서 만든 컨텍스트를 해제합니다.

비동기 SSPI 함수

다음 함수는 동기와 동일한 모든 매개 변수 외에도 비동기 컨텍스트를 허용합니다.

API 이름 Description
SspiAcquireCredentialsHandleAsync 보안 주체의 기존 자격 증명에 대한 핸들을 비동기적으로 획득합니다.
SspiAcceptSecurityContextAsync 전송 애플리케이션의 서버 구성 요소가 서버와 원격 클라이언트 간에 보안 컨텍스트를 비동기적으로 설정할 수 있습니다.
SspiInitializeSecurityContextAsync 비동기 보안 컨텍스트를 초기화합니다.
SspiDeleteSecurityContextAsync SspiInitializeSecurityContextAsync 함수 또는 SspiAcceptSecurityContextAsync 함수에 대한 이전 호출에서 시작된 지정된 보안 컨텍스트와 연결된 로컬 데이터 구조를 삭제합니다.
SspiFreeCredentialsHandleAsync 자격 증명 핸들을 해제합니다.

API 샘플

일반적인 호출 흐름은 다음과 같이 작동합니다.

  1. SspiCreateAsyncContext를 사용하여 호출을 추적하는 SspiAsyncContext 컨텍스트 만들기
  2. 컨텍스트에 대한 SspiAsyncNotifyCallback 등록
  3. SspiAcceptSecurityContextAsync를 사용하여 비동기 호출
  4. 콜백 시 SspiGetAsyncCallStatus를 사용하여 결과 검색
  5. SspiDeleteSecurityContextAsync를 사용하여 SspiAsyncContext를 삭제합니다. SspiReinitAsyncContext를 사용하여 컨텍스트를 다시 사용하는 경우 2단계로 돌아갑니다.

아래 샘플에서는 SspiAcceptSecurityContextAsync 호출을 보여 줍니다. 샘플은 호출이 완료되기를 기다렸다가 결과를 검색합니다.

전체 SSPI 핸드셰이크에서 SspiAcceptSecurityContextAsync 및 SspiInitializeSecurityContextAsync는 SEC_E_OK 반환될 때까지 여러 번 호출됩니다. SspiReinitAsyncContext는 사용 편의성과 이 경우 성능을 용이하게 하기 위해 제공되었습니다.

어설션은 성공 시 예상되는 사항을 강조하는 데 사용됩니다.

#include <sspi.h>

void AsyncCallCompleted(
    _In_     SspiAsyncContext* AsyncContext,
    _In_opt_ PVOID pCallbackData
)
{
    // Get result.
    SECURITY_STATUS Status = SspiGetAsyncCallStatus(AsyncContext);
    ASSERT(SEC_E_OK == Status);

    // *Perform any needed callback actions, use pCallbackData if needed*

    // Clean up async context when done.
    SspiFreeAsyncContext(AsyncContext);
}

void DoASCCall(
    _In_opt_  PCredHandle    phCred,
    _In_opt_  PCtxtHandle    phContext,
    _In_opt_  PSecBufferDesc pInput,
    _In_opt_  PSecBufferDesc pOutput,
    _Out_     unsigned long* pfContextAttr,
    _Out_opt_ PTimeStamp     ptsExpiry
)
{
    // Create context for async call
    SspiAsyncContext* AsyncContext = SspiCreateAsyncContext();

    // Check for out of memory condition
    ASSERT(AsyncContext);

    // Register callback that continues execution upon completion.
    PVOID pCallbackData = … ; // *Setup any state needed for callback.*
    SECURITY_STATUS Status = SspiSetAsyncNotifyCallback(AsyncContext,
                                        AsyncCallCompleted,
                                        pCallbackData);
    ASSERT(SEC_E_OK == Status);

    // Queue asynchronous call.
    Status = SspiAcceptSecurityContextAsync(AsyncContext,
                                            phCred,
                                            phContext,
                                            pInput,
                                            ASC_REQ_CONNECTION,
                                            SECURITY_NATIVE_DREP,
                                            phContext,
                                            pOutput,
                                            pfContextAttr,
                                            ptsExpiry);

    // All async functions return the status of queueing the async call,
    // not the call’s result.
    ASSERT(SEC_E_OK == Status);

    // At this point, the call can be pending or complete.
    // If complete, the result or error is returned.
    // For this example, we assume if it finished, it finished with SEC_E_OK.
    Status = SspiGetAsyncCallStatus(AsyncContext);
    ASSERT(SEC_I_ASYNC_CALL_PENDING == Status ||
           SEC_E_OK == Status);

    // Execution will continue in the callback upon completion
}

참고 항목

sspi.h 헤더

SSPI 함수

SSPI 구조체