Compartilhar via


Verificando o acesso com a API do Authz

Os aplicativos determinam se devem conceder acesso a objetos protegíveis chamando a função AuthzAccessCheck .

A função AuthzAccessCheck usa estruturas AUTHZ_ACCESS_REQUEST e SECURITY_DESCRIPTOR como parâmetros. A estrutura AUTHZ_ACCESS_REQUEST especifica um nível de acesso solicitado. A função AuthzAccessCheck avalia o acesso solicitado em relação ao SECURITY_DESCRIPTOR especificado para um contexto de cliente especificado. Para obter informações sobre como um descritor de segurança controla o acesso a um objeto, consulte Como os DACLs controlam o acesso a um objeto.

As variáveis de atributo devem estar na forma de uma expressão quando usadas com operadores lógicos; caso contrário, eles são avaliados como desconhecidos.

Função de retorno da chamada

Se a DACL (lista de controle de acesso discricionário ) do SECURITY_DESCRIPTOR do objeto a ser verificado contiver quaisquer ACEs ( entradas de controle de acesso de retorno de chamada), AuthzAccessCheck chamará a função AuthzAccessCheckCallback para cada ACE de retorno de chamada contido na DACL. Um ACE de retorno de chamada é qualquer estrutura ACE cujo tipo ACE contém a palavra "retorno de chamada". A função AuthzAccessCheckCallback é uma função definida pelo aplicativo que deve ser registrada quando o gerenciador de recursos é inicializado chamando a função AuthzInitializeResourceManager .

Uma função de retorno de chamada permite que um aplicativo defina a lógica de negócios a ser avaliada em runtime. Quando a função AuthzAccessCheckCallback é chamada, o ACE de retorno de chamada que causou a chamada é passado para a função de retorno de chamada para avaliação. Se a lógica definida pelo aplicativo for avaliada como TRUE, o ACE de retorno de chamada será incluído no marcar de acesso. Caso contrário, será ignorada.

Resultados do acesso em cache

Os resultados de uma marcar de acesso podem ser armazenados em cache e usados em chamadas futuras para a função AuthzCachedAccessCheck. Para obter mais informações sobre como armazenar em cache as verificações de acesso, incluindo um exemplo, consulte Verificações de acesso em cache.

Exemplo

O exemplo a seguir cria uma SECURITY_DESCRIPTOR que permite acesso READ_CONTROL a administradores internos. Ele usa esse descritor de segurança para marcar acesso para o cliente especificado pelo contexto do cliente criado no exemplo em Inicializando um contexto de cliente.

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;

}

Adicionando SIDs a um contexto de cliente

Verificações de acesso de cache

Inicializando um contexto de cliente

Consultando um contexto de cliente