다음을 통해 공유


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

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

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

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

콜백 함수

검사할 개체의 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 추가

캐싱 액세스 검사

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

클라이언트 컨텍스트 쿼리하기