다음을 통해 공유


AcceptSecurityContext(일반) 함수

AcceptSecurityContext(일반) 함수를 사용하면 전송 애플리케이션의 서버 구성 요소가 서버와 원격 클라이언트 간에 보안 컨텍스트를 설정할 수 있습니다. 원격 클라이언트는 InitializeSecurityContext(일반) 함수를 사용하여 보안 컨텍스트를 설정하는 프로세스를 시작합니다. 서버는 보안 컨텍스트 설정을 완료하기 위해 원격 클라이언트에서 하나 이상의 회신 토큰을 요구할 수 있습니다.

특정 SSP(보안 지원 공급자)에서 이 함수를 사용하는 방법에 대한 자세한 내용은 다음 topics 참조하세요.

항목 Description
AcceptSecurityContext(CredSSP) 전송 애플리케이션의 서버 구성 요소가 CredSSP(자격 증명 보안 지원 공급자)를 사용하여 서버와 원격 클라이언트 간에 보안 컨텍스트 를 설정할 수 있도록 허용합니다.
AcceptSecurityContext(다이제스트) 전송 애플리케이션의 서버 구성 요소가 다이제스트를 사용하는 원격 클라이언트와 서버 간에 보안 컨텍스트 를 설정할 수 있도록 합니다.
AcceptSecurityContext(Kerberos) 전송 애플리케이션의 서버 구성 요소가 Kerberos를 사용하는 원격 클라이언트와 서버 간에 보안 컨텍스트 를 설정할 수 있도록 합니다.
AcceptSecurityContext(협상) 전송 애플리케이션의 서버 구성 요소가 Negotiate를 사용하는 원격 클라이언트와 서버 간에 보안 컨텍스트 를 설정할 수 있도록 합니다.
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(일반) 함수를 호출합니다.

phContext[in, out]

CtxtHandle 구조체에 대한 포인터입니다. AcceptSecurityContext(일반)에 대한 첫 번째 호출에서 이 포인터는 입니다NULL. 후속 호출에서 phContext 는 첫 번째 호출에 의해 phNewContext 매개 변수에 반환된 부분적으로 구성된 컨텍스트에 대한 핸들입니다.

경고

AcceptSecurityContext(일반)에 대한 동시 호출에서 동일한 컨텍스트 핸들을 사용하지 마세요. 보안 서비스 공급자의 API 구현은 스레드로부터 안전하지 않습니다.

pInput[in, optional]

입력 버퍼 설명자를 포함하는 InitializeSecurityContext(일반)에 대한 클라이언트 호출에 의해 생성된 SecBufferDesc 구조체에 대한 포인터입니다.

Schannel SSP를 사용하는 경우 첫 번째 버퍼는 SECBUFFER_TOKEN 형식이어야 하며 클라이언트에서 받은 보안 토큰을 포함해야 합니다. 두 번째 버퍼는 SECBUFFER_EMPTY 형식이어야 합니다.

Negotiate, Kerberos 또는 NTLM SSP를 사용하는 경우 InitializeSecurityContext(일반) 함수를 호출하여 생성된 버퍼 외에도 SECBUFFER_CHANNEL_BINDINGS 형식의 SecBuffer 구조를 전달하여 채널 바인딩 정보를 지정할 수 있습니다. 채널 바인딩 버퍼에 대한 채널 바인딩 정보는 클라이언트가 인증하는 데 사용한 Schannel 컨텍스트에서 QueryContextAttributes(Schannel) 함수를 호출하여 가져올 수 있습니다.

fContextReq[in]

컨텍스트를 설정하는 데 서버에서 요구하는 특성을 지정하는 비트 플래그입니다. 비트 OR 연산을 사용하여 비트 플래그를 결합할 수 있습니다. 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.

의미
ASC_REQ_ALLOCATE_MEMORY 다이제스트와 Schannel은 출력 버퍼를 할당합니다. 출력 버퍼 사용을 마쳤으면 FreeContextBuffer 함수를 호출하여 해제합니다.
ASC_REQ_ALLOW_MISSING_BINDINGS 다이제스트에 내부 및 외부 채널 모두에 대한 채널 바인딩이 필요하지 않음을 나타냅니다. 이 값은 엔드포인트 채널 바인딩에 대한 지원을 알 수 없는 경우 이전 버전과의 호환성을 위해 사용됩니다.
이 값은 ASC_REQ_PROXY_BINDINGS 함께 사용할 수 없습니다.
이 값은 다이제스트 SSP에서만 지원됩니다.
Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다.
ASC_REQ_CONFIDENTIALITY 메시지를 암호화하고 암호를 해독합니다.
다이제스트 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 다이제스트에 채널 바인딩이 필요했음을 나타냅니다.
이 값은 ASC_REQ_ALLOW_MISSING_BINDINGS 함께 사용할 수 없습니다.
이 값은 다이제스트 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(일반)에 대한 첫 번째 호출에서 이 포인터는 새 컨텍스트 핸들을 받습니다. 후속 호출에서 phNewContextphContext 매개 변수에 지정된 핸들과 같을 수 있습니다. phNewContext는 해서는 안 됩니다 NULL.

pOutput[in, out, optional]

출력 버퍼 설명 자를 포함하는 SecBufferDesc 구조체에 대한 포인터입니다. 이 버퍼는 InitializeSecurityContext(일반)에 대한 추가 호출에 대한 입력을 위해 클라이언트로 전송됩니다. 함수가 SEC_E_OK 반환하는 경우에도 출력 버퍼가 생성될 수 있습니다. 생성된 모든 버퍼는 클라이언트 애플리케이션으로 다시 보내야 합니다.

Schannel을 사용하는 경우 출력 시 이 버퍼는 보안 컨텍스트에 대한 토큰을 받습니다. 토큰을 클라이언트로 보내야 합니다. 함수는 SECBUFFER_EXTRA 형식의 버퍼를 반환할 수도 있습니다. 또한 호출자는 SECBUFFER_ALERT 형식의 버퍼를 전달해야 합니다. 출력에서 경고가 생성되면 이 버퍼에 해당 경고에 대한 정보가 포함되고 함수가 실패합니다.

pfContextAttr[out]

설정된 컨텍스트의 특성을 나타내는 비트 플래그 집합을 수신하는 변수에 대한 포인터입니다. 다양한 특성에 대한 설명은 컨텍스트 요구 사항을 참조하세요. 이 매개 변수에 사용되는 플래그에는 ASC_RET 접두사(예: ASC_RET_DELEGATE)가 있습니다.

최종 함수 호출이 성공적으로 반환될 때까지 보안 관련 특성에 대해 검사 않습니다. ASC_RET_ALLOCATED_MEMORY 플래그와 같이 보안과 관련이 없는 특성 플래그는 최종 반환 전에 확인할 수 있습니다.

ptsTimeStamp[out, optional]

컨텍스트의 만료 시간을 수신하는 TimeStamp 구조체에 대한 포인터입니다. 보안 패키지는 항상 로컬 시간에 이 값을 반환하는 것이 좋습니다.

이 매개 변수는 일정한 최대 시간으로 설정됩니다. 다이제스트 보안 컨텍스트또는 자격 증명 또는 다이제스트 SSP를 사용하는 경우 만료 시간이 없습니다.

Schannel SSP를 사용하는 경우 선택 사항입니다. 원격 당사자가 인증에 사용할 인증서를 제공한 경우 이 매개 변수는 해당 인증서의 만료 시간을 받습니다. 인증서가 제공되지 않은 경우 최대 시간 값이 반환됩니다.

참고

인증 프로세스의 마지막 호출까지는 협상의 이후 단계에서 추가 정보가 제공되므로 컨텍스트의 만료 시간이 올바르지 않을 수 있습니다. 따라서 ptsTimeStamp 는 함수에 대한 마지막 호출까지여야 합니다 NULL .

반환 값

이 함수는 다음 값 중 하나를 반환합니다.

반환 코드/값설명
SEC_E_BAD_BINDINGS
0x80090346L
함수가 실패했습니다. 채널 바인딩 정책이 충족되지 않았습니다.
SEC_E_INCOMPLETE_MESSAGE
0x80090318L
함수가 성공했습니다. 입력 버퍼의 데이터가 불완전합니다. 애플리케이션은 클라이언트에서 추가 데이터를 읽고 [AcceptSecurityContext(일반)](acceptsecuritycontext--general.md)를 다시 호출해야 합니다.
Schannel SSP를 사용할 때 이 값을 반환할 수 있습니다. 이 반환 값에 대한 자세한 내용은 [AcceptSecurityContext(Schannel)](acceptsecuritycontext--schannel.md)를 참조하세요.
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 매개 변수에 지정된 자격 증명 핸들이 잘못되었습니다. 다이제스트 또는 Schannel SSP를 사용할 때 이 값을 반환할 수 있습니다.
SEC_E_OK
0x00000000L
함수가 성공했습니다. [*보안 컨텍스트*](.. 클라이언트로부터 받은 /secgloss/s-gly.md)가 수락되었습니다. 출력 토큰이 함수에 의해 생성된 경우 클라이언트 프로세스로 보내야 합니다.
SEC_E_SECURITY_QOS_FAILED
0x80090332L
함수가 실패했습니다. 유효하지 않은 컨텍스트 특성 플래그가 fContextReq 매개 변수에 지정되었습니다. 다이제스트 SSP를 사용할 때 이 값을 반환할 수 있습니다.
SEC_E_UNSUPPORTED_FUNCTION
0x80090302L
함수가 실패했습니다. 유효하지 않은 컨텍스트 특성 플래그(ASC_REQ_DELEGATE 또는 ASC_REQ_PROMPT_FOR_CREDS)가 fContextReq 매개 변수에 지정되었습니다. Schannel SSP를 사용할 때 이 값을 반환할 수 있습니다.
SEC_I_COMPLETE_AND_CONTINUE
0x00090314L
함수가 성공했습니다. 서버는 [CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken)을 호출하고 출력 토큰을 클라이언트에 전달해야 합니다. 그런 다음 서버는 클라이언트에서 반환 토큰을 기다린 다음 [AcceptSecurityContext(일반)](acceptsecuritycontext--general.md)를 다시 호출합니다.
SEC_I_COMPLETE_NEEDED
0x00090313L
함수가 성공했습니다. 서버는 클라이언트에서 메시지 빌드를 완료한 다음 [CompleteAuthToken](/windows/win32/api/sspi/nf-sspi-completeauthtoken) 함수를 호출해야 합니다.
SEC_I_CONTINUE_NEEDED
0x00090312L
함수가 성공했습니다. 서버는 출력 토큰을 클라이언트에 보내고 반환된 토큰을 기다려야 합니다. 반환된 토큰은 [AcceptSecurityContext(일반)](acceptsecuritycontext--general.md)에 대한 다른 호출을 위해 pInput으로 전달되어야 합니다.
STATUS_LOGON_FAILURE
0xC000006DL
함수가 실패했습니다. 지정된 컨텍스트가 설정된 후 [AcceptSecurityContext(일반)](acceptsecuritycontext--general.md) 함수가 호출되었습니다. 다이제스트 SSP를 사용할 때 이 값을 반환할 수 있습니다.

설명

AcceptSecurityContext(일반) 함수는 InitializeSecurityContext(일반) 함수에 대응하는 서버입니다.

서버가 클라이언트로부터 요청을 받으면 서버는 fContextReq 매개 변수를 사용하여 세션에 필요한 항목을 지정합니다. 이러한 방식으로 서버는 클라이언트가 기밀 또는 무결성 검사 세션을 사용할 수 있어야 하며 해당 요구를 충족할 수 없는 클라이언트를 거부할 수 있도록 지정할 수 있습니다. 또는 서버에서 아무 것도 필요하지 않으며 클라이언트가 제공하거나 요구할 수 있는 모든 것이 pfContextAttr 매개 변수에 반환됩니다.

상호 인증과 같은 다중 다리 인증을 지원하는 패키지의 경우 호출 시퀀스는 다음과 같습니다.

  1. 클라이언트는 토큰을 서버로 전송합니다.
  2. 서버는 처음으로 AcceptSecurityContext(일반) 를 호출하여 클라이언트로 전송되는 회신 토큰을 생성합니다.
  3. 클라이언트는 토큰을 수신하고 InitializeSecurityContext(일반)에 전달합니다. InitializeSecurityContext(일반)가 SEC_E_OK 반환하면 상호 인증이 완료되고 보안 세션을 시작할 수 있습니다. InitializeSecurityContext(일반)가 오류 코드를 반환하면 상호 인증 협상이 종료됩니다. 그렇지 않으면 InitializeSecurityContext(일반) 에서 반환된 보안 토큰이 클라이언트로 전송되고 2단계와 3단계가 반복됩니다.
  4. AcceptSecurityContext(일반)에 대한 동시 호출에는 phContext 값을 사용하지 마세요. 보안 공급자의 구현은 스레드로부터 안전하지 않습니다.

fContextReqpfContextAttr 매개 변수는 다양한 컨텍스트 특성을 나타내는 비트 마스크입니다. 다양한 특성에 대한 설명은 컨텍스트 요구 사항을 참조하세요.

참고

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(일반)