다음을 통해 공유


인증된 SSPI 클라이언트 작성

모든 RPC 클라이언트/서버 세션에는 클라이언트와 서버 간의 바인딩이 필요합니다. 클라이언트/서버 애플리케이션에 보안을 추가하려면 프로그램에서 인증된 바인딩을 사용해야 합니다. 이 섹션에서는 클라이언트와 서버 간에 인증된 바인딩을 만드는 프로세스를 설명합니다.

관련 정보는 SDK(플랫폼 소프트웨어 개발 키트)에서 대부분의 보안 패키지 및 프로토콜에 사용되는 절차를 참조하세요.

클라이언트 쪽 바인딩 핸들 만들기

서버 프로그램을 사용하여 인증된 세션을 만들려면 클라이언트 애플리케이션이 바인딩 핸들을 사용하여 인증 정보를 제공해야 합니다. 인증된 바인딩 핸들을 설정하기 위해 클라이언트는 RpcBindingSetAuthInfo 또는 RpcBindingSetAuthInfoEx 함수를 호출합니다. 이 두 함수는 거의 동일합니다. 둘 사이의 유일한 차이점은 클라이언트가 RpcBindingSetAuthInfoEx 함수를 사용하여 서비스 품질을 지정할 수 있다는 것입니다.

다음 코드 조각에서는 RpcBindingSetAuthInfo 에 대한 호출이 어떻게 표시되는지 보여 줍니다.

// This code fragment assumes that rpcBinding is a valid binding 
// handle between the client and the server. It also assumes that
// pAuthCredentials is a valid pointer to a data structure which
// contains the user's authentication credentials.

dwStatus = DsMakeSpn(
    "ldap",
    "ServerName.domain.com",
    NULL,
    0,
    NULL,
    &pcSpnLength,
    pszSpn);

//...

rpcStatus = RpcBindingSetAuthInfo(
    rpcBinding,                       // Valid binding handle
    pszSpn,                           // Principal name 
    RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,  // Authentication level
    RPC_C_AUTHN_GSS_NEGOTIATE,        // Use Negotiate SSP
    NULL,                             // Authentication credentials <entity type="ndash"/> use current thread credentials
    RPC_C_AUTHZ_NAME);                // Authorization service

클라이언트가 RpcBindingSetAuthInfo 또는 RpcBindingSetAuthInfoEx 함수를 성공적으로 호출한 후 RPC 런타임 라이브러리는 바인딩에 대한 모든 RPC 호출을 자동으로 인증합니다. 클라이언트가 선택하는 보안 및 인증 수준은 해당 바인딩 핸들에만 적용됩니다. 바인딩 핸들에서 파생된 컨텍스트 핸들은 동일한 보안 정보를 사용하지만 바인딩 핸들에 대한 후속 수정 내용은 컨텍스트 핸들에 반영되지 않습니다. 자세한 내용은 컨텍스트 핸들을 참조하세요.

인증 수준은 클라이언트가 다른 수준을 선택하거나 프로세스가 종료될 때까지 계속 적용됩니다. 대부분의 애플리케이션은 보안 수준을 변경할 필요가 없습니다. 클라이언트는 RpcBindingInqAuthClient 를 호출하고 바인딩 핸들을 전달하여 바인딩 핸들을 쿼리하여 권한 부여 정보를 가져올 수 있습니다.

서버에 클라이언트 자격 증명 제공

서버는 클라이언트의 바인딩 정보를 사용하여 보안을 적용합니다. 클라이언트는 항상 바인딩 핸들을 원격 프로시저 호출의 첫 번째 매개 변수로 전달합니다. 그러나 IDL 파일 또는 서버의 ACF(애플리케이션 구성 파일)에서 원격 프로시저에 대한 첫 번째 매개 변수로 선언되지 않는 한 서버는 핸들을 사용할 수 없습니다. IDL 파일에서 바인딩 핸들을 나열하도록 선택할 수 있지만, 이렇게 하면 모든 클라이언트가 자동 또는 암시적 바인딩을 사용하지 않고 바인딩 핸들을 선언하고 조작해야 합니다. 자세한 내용은 IDL 및 ACF 파일을 참조하세요.

또 다른 방법은 바인딩 핸들을 IDL 파일에서 벗어나 서버의 ACF에 explicit_handle 특성을 배치하는 것입니다. 이러한 방식으로 클라이언트는 애플리케이션에 가장 적합한 바인딩 형식을 사용할 수 있지만 서버는 명시적으로 선언된 것처럼 바인딩 핸들을 사용합니다.

바인딩 핸들에서 클라이언트 자격 증명을 추출하는 프로세스는 다음과 같이 발생합니다.

  • RPC 클라이언트는 RpcBindingSetAuthInfo를 호출하고 서버에 전달된 바인딩 정보의 일부로 인증 정보를 포함합니다.
  • 일반적으로 서버는 클라이언트인 것처럼 동작하기 위해 RpcImpersonateClient 를 호출합니다. 바인딩 핸들이 인증되지 않으면 RPC_S_NO_CONTEXT_AVAILABLE 호출이 실패합니다. 클라이언트의 사용자 이름을 가져오려면 가장 하는 동안 RpcBindingInqAuthClient 를 호출하거나 Windows XP 이상 버전의 Windows에서 RpcGetAuthorizationContextForClient 를 호출하여 권한 부여 컨텍스트를 가져온 다음 Authz 함수를 사용하여 이름을 검색합니다.
  • 서버는 일반적으로 CreatePrivateObjectSecurity 를 호출하여 ACL을 사용하여 개체를 만듭니다. 이 작업이 완료되면 나중에 보안 검사가 자동으로 수행됩니다.