인증된 SSPI 서버 작성
클라이언트와 서버 프로그램 간에 인증된 통신이 이루어지려면 먼저 서버에서 인증 정보를 등록해야 합니다. 특히 서버는 주체 이름을 등록하고 사용하는 인증 서비스를 지정해야 합니다. 보안 주체 이름에 대한 자세한 내용은 보안 주체 이름을 참조하세요. 인증 서비스에 대한 자세한 내용은 인증 서비스를 참조하세요.
인증 정보를 등록하기 위해 서버는 RpcServerRegisterAuthInfo 함수를 호출합니다. 주 이름에 대한 포인터를 첫 번째 매개 변수의 값으로 전달합니다. 두 번째 매개 변수를 애플리케이션에서 사용할 인증 서비스를 나타내는 상수로 설정합니다. 인증 서비스에 대한 설명은 Authentication-Service 상수를 참조하세요.
또한 서버는 키 획득 함수의 주소를 세 번째 매개 변수의 값으로 전달할 수도 있습니다. 키 획득 함수를 참조하세요. 선택한 인증 서비스에 기본 키 획득 함수를 사용하려면 세 번째 매개 변수를 NULL로 설정합니다. RpcServerRegisterAuthInfo 함수에 대한 마지막 매개 변수는 키 획득 함수를 제공하는 경우 키 획득 함수에 전달할 포인터 데이터입니다. RpcServerRegisterAuthInfo에 대한 호출은 다음 코드 조각에 표시됩니다.
dwStatus = DsMakeSpn(
"ldap",
"ServerName.domain.com",
NULL,
0,
NULL,
&pcSpnLength,
pszSpn);
rpcStatus = RpcServerRegisterAuthInfo (
psz, // Server principal name
RPC_C_AUTHN_GSS_NEGOTIATE, // Authentication service
NULL, // Use default key function
NULL); // No arg for key function
또한 서버는 RPC 런타임 라이브러리에 권한 부여 함수를 제공할 수 있습니다. 권한 부여 함수를 설정하려면 RpcMgmtSetAuthorizationFn 함수를 호출합니다.
분산 애플리케이션의 서버 부분은 RpcBindingInqAuthClient 또는 RpcBindingInqAuthClientEx 함수를 호출하여 인증 정보에 대한 바인딩 핸들을 쿼리할 수 있습니다.
서버가 보안 지원 공급자에 등록하는 경우 잘못된 자격 증명이 있는 클라이언트 호출은 디스패치되지 않습니다. 그러나 자격 증명이 없는 호출은 디스패치됩니다. 이 문제가 발생하지 않도록 하는 세 가지 방법이 있습니다.
- RpcServerRegisterIfEx를 사용하여 보안 콜백 함수를 사용하여 인터페이스를 등록합니다. 이렇게 하면 RPC 런타임 라이브러리가 해당 인터페이스에 대한 인증되지 않은 호출을 자동으로 거부합니다. 콜백 함수 등록은 액세스 자격 증명을 확인하는 다른 방법과 호환됩니다. 콜백 함수는 RpcImpersonateClient, RpcGetAuthorizationContextForClient 또는 RpcBindingInqAuthClientEx 함수 등을 호출할 수 있습니다. 그러나 이러한 함수는 해당 시점에서 경계를 해제하지 않으므로 함수에 전달된 인수를 사용할 수 없습니다.
중요
RpcServerRegisterIfEx를 사용하여 보안 콜백 함수를 사용하여 인터페이스를 등록하는 것이 클라이언트 자격 증명을 확인하는 가장 권장되는 방법입니다.
- RpcBindingInqAuthClient를 호출하여 클라이언트에서 사용 중인 보안 수준을 확인합니다. 그러면 클라이언트가 인증되지 않은 경우 스텁에서 오류를 반환할 수 있습니다.