Comprobación del acceso con la API de Authz

Las aplicaciones determinan si se debe conceder acceso a objetos protegibles mediante una llamada a la función AuthzAccessCheck .

La función AuthzAccessCheck toma AUTHZ_ACCESS_REQUEST y SECURITY_DESCRIPTOR estructuras como parámetros. La estructura AUTHZ_ACCESS_REQUEST especifica un nivel de acceso solicitado. La función AuthzAccessCheck evalúa el acceso solicitado en el SECURITY_DESCRIPTOR especificado para un contexto de cliente especificado. Para obtener información sobre cómo un descriptor de seguridad controla el acceso a un objeto, vea Cómo controlan los DACL el acceso a un objeto.

Las variables de atributo deben estar en forma de expresión cuando se usan con operadores lógicos; de lo contrario, se evalúan como desconocidos.

Función de devolución de llamada

Si la lista de control de acceso discrecional (DACL) del SECURITY_DESCRIPTOR del objeto que se va a comprobar contiene las entradas de control de acceso de devolución de llamada (ACE), AuthzAccessCheck llama a la función AuthzAccessCheckCallback para cada ACE de devolución de llamada contenida en la DACL. Una ACE de devolución de llamada es cualquier estructura ACE cuyo tipo ace contiene la palabra "callback". La función AuthzAccessCheckCallback es una función definida por la aplicación que se debe registrar cuando se inicializa el administrador de recursos mediante una llamada a la función AuthzInitializeResourceManager .

Una función de devolución de llamada permite a una aplicación definir la lógica de negocios que se va a evaluar en tiempo de ejecución. Cuando se llama a la función AuthzAccessCheckCallback , la ACE de devolución de llamada que provocó la llamada se pasa a la función de devolución de llamada para su evaluación. Si la lógica definida por la aplicación se evalúa como TRUE, la ACE de devolución de llamada se incluye en la comprobación de acceso. De lo contrario, se omite.

Almacenar en caché los resultados del acceso

Los resultados de una comprobación de acceso se pueden almacenar en caché y usarse en llamadas futuras a la función AuthzCachedAccessCheck . Para obtener más información sobre el almacenamiento en caché de comprobaciones de acceso, incluido un ejemplo, consulte Comprobaciones de acceso de almacenamiento en caché.

Ejemplo

En el ejemplo siguiente se crea un SECURITY_DESCRIPTOR que permite el acceso READ_CONTROL a los administradores integrados. Usa ese descriptor de seguridad para comprobar el acceso del cliente especificado por el contexto de cliente creado en el ejemplo en Inicialización de un 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;

}

Adición de SID a un contexto de cliente

Almacenamiento en caché de comprobaciones de acceso

Inicialización de un contexto de cliente

Consulta de un contexto de cliente