다음을 통해 공유


Authz API를 사용하여 액세스 확인

애플리케이션은 AuthzAccessCheck 함수를 호출하여 보안 개체에 대한 액세스 권한을 부여할지 여부를 결정합니다.

AuthzAccessCheck 함수는 AUTHZ_ACCESS_REQUESTSECURITY_DESCRIPTOR 구조를 매개 변수로 사용합니다. AUTHZ_ACCESS_REQUEST 구조는 요청된 액세스 수준을 지정합니다. AuthzAccessCheck 함수는 지정된 클라이언트 컨텍스트에 대해 지정된 SECURITY_DESCRIPTOR 대해 요청된 액세스를 평가합니다. 보안 설명자가 개체에 대한 액세스를 제어하는 방법에 대한 자세한 내용은 DACLs가 개체에 대한 액세스를 제어하는 방법을 참조하세요.

특성 변수는 논리 연산자에서 사용되는 경우 식 형식이어야 합니다. 그렇지 않으면 알 수 없음으로 평가됩니다.

Callback 함수

검사할 개체의 SECURITY_DESCRIPTOR DACL(임의 액세스 제어 목록)에 ACE(콜백 액세스 제어 항목)가 포함된 경우 AuthzAccessCheck는 DACL에 포함된 각 콜백 ACE에 대해 AuthzAccessCheckCallback 함수를 호출합니다. 콜백 ACE는 ACE 형식에 "콜백"이라는 단어가 포함된 ACE 구조체입니다. AuthzAccessCheckCallback 함수는 AuthzInitializeResourceManager 함수를 호출하여 리소스 관리자가 초기화될 때 등록해야 하는 애플리케이션 정의 함수입니다.

콜백 함수를 사용하면 애플리케이션이 런타임에 평가할 비즈니스 논리를 정의할 수 있습니다. AuthzAccessCheckCallback 함수가 호출되면 호출을 발생시킨 콜백 ACE가 평가를 위해 콜백 함수에 전달됩니다. 애플리케이션 정의 논리가 TRUE로 평가되면 콜백 ACE가 액세스 검사 포함됩니다. 그렇지 않은 경우 이 설정은 무시됩니다.

액세스 결과 캐싱

액세스 검사 결과는 AuthzCachedAccessCheck 함수에 대한 이후 호출에서 캐시되고 사용될 수 있습니다. 예제를 포함하여 액세스 검사를 캐싱하는 방법에 대한 자세한 내용은 액세스 검사 캐싱을 참조하세요.

예제

다음 예제에서는 기본 제공 관리자에 대한 READ_CONTROL 액세스를 허용하는 SECURITY_DESCRIPTOR 만듭니다. 이 보안 설명자를 사용하여 클라이언트 컨텍스트 초기화 예제에서 만든 클라이언트 컨텍스트에 지정된 클라이언트에 대한 액세스를 검사.

BOOL CheckAccess(AUTHZ_CLIENT_CONTEXT_HANDLE hClientContext)
{
    #define MY_MAX 4096


    PSECURITY_DESCRIPTOR    pSecurityDescriptor = NULL;
    ULONG                    cbSecurityDescriptorSize = 0;
    AUTHZ_ACCESS_REQUEST    Request;
    CHAR                    ReplyBuffer[MY_MAX];
    PAUTHZ_ACCESS_REPLY        pReply = (PAUTHZ_ACCESS_REPLY)ReplyBuffer;
    DWORD                    AuthzError =0;

    //Allocate memory for the access request structure.
    RtlZeroMemory(&Request, sizeof(AUTHZ_ACCESS_REQUEST));

    //Set up the access request structure.
    Request.DesiredAccess = READ_CONTROL;
    
    //Allocate memory for the access reply structure.
    RtlZeroMemory(ReplyBuffer, MY_MAX);

    //Set up the access reply structure.
    pReply->ResultListLength = 1;
    pReply->Error = (PDWORD) ((PCHAR) pReply + sizeof(AUTHZ_ACCESS_REPLY));
    pReply->GrantedAccessMask = (PACCESS_MASK) (pReply->Error + pReply->ResultListLength);
    pReply->SaclEvaluationResults = NULL;

    //Create security descriptor.
    if(!ConvertStringSecurityDescriptorToSecurityDescriptor(
        L"O:LAG:BAD:(A;;RC;;;BA)",
        SDDL_REVISION_1,
        &pSecurityDescriptor,
        NULL))
    {
        printf_s("ConvertStringSecurityDescriptorToSecurityDescriptor failed with %d\n", GetLastError()); 
        return FALSE;
    }

    //Call AuthzAccessCheck.
    if(!AuthzAccessCheck(
        0,
        hClientContext,
        &Request,
        NULL,
        pSecurityDescriptor,
        NULL,
        0,
        pReply,
        NULL))
    {
        printf_s("AuthzAccessCheck failed with %d\n", GetLastError());
        
    LocalFree(pSecurityDescriptor);
    
        return FALSE;
    }


    //Print results.
    if(*pReply->GrantedAccessMask & READ_CONTROL)
    {
        printf_s("Access granted.\n");
    }
    else
    {
        printf_s("Access denied.\n");
    }

  LocalFree(pSecurityDescriptor);
    return TRUE;

}

클라이언트 컨텍스트에 SID 추가

액세스 검사 캐싱

클라이언트 컨텍스트 초기화

클라이언트 컨텍스트 쿼리