Partager via


Vérification de l’accès avec l’API Authz

Les applications déterminent s’il faut accorder l’accès aux objets sécurisables en appelant la fonction AuthzAccessCheck .

La fonction AuthzAccessCheck prend les structures AUTHZ_ACCESS_REQUEST et SECURITY_DESCRIPTOR en tant que paramètres. La structure AUTHZ_ACCESS_REQUEST spécifie un niveau d’accès demandé. La fonction AuthzAccessCheck évalue l’accès demandé par rapport au SECURITY_DESCRIPTOR spécifié pour un contexte client spécifié. Pour plus d’informations sur la façon dont un descripteur de sécurité contrôle l’accès à un objet, consultez How DACLs Control Access to an Object.

Les variables d’attribut doivent être sous la forme d’une expression lorsqu’elles sont utilisées avec des opérateurs logiques ; sinon, ils sont évalués comme inconnus.

Fonction de rappel

Si la liste de contrôle d’accès discrétionnaire (DACL) de l’SECURITY_DESCRIPTOR de l’objet à vérifier contient des entrées de contrôle d’accès de rappel ,AuthzAccessCheck Appelle la fonction AuthzAccessCheckCallback pour chaque ACE de rappel contenue dans la liste DACL. Un ACE de rappel est toute structure ACE dont le type ACE contient le mot « rappel ». La fonction AuthzAccessCheckCallback est une fonction définie par l’application qui doit être inscrite lorsque le gestionnaire de ressources est initialisé en appelant la fonction AuthzInitializeResourceManager .

Une fonction de rappel permet à une application de définir une logique métier à évaluer au moment de l’exécution. Lorsque la fonction AuthzAccessCheckCallback est appelée, l’ACE de rappel à l’origine de l’appel est passé à la fonction de rappel pour évaluation. Si la logique définie par l’application est évaluée comme TRUE, l’ACE de rappel est inclus dans le case activée d’accès. Sinon, il est ignoré.

Mise en cache des résultats d’accès

Les résultats d’un case activée d’accès peuvent être mis en cache et utilisés dans les appels futurs à la fonction AuthzCachedAccessCheck. Pour plus d’informations sur la mise en cache des vérifications d’accès, notamment un exemple, consultez Mise en cache des vérifications d’accès.

Exemple

L’exemple suivant crée une SECURITY_DESCRIPTOR qui autorise READ_CONTROL accès aux administrateurs intégrés. Il utilise ce descripteur de sécurité pour case activée accès au client spécifié par le contexte client créé dans l’exemple d’initialisation d’un contexte client.

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;

}

Ajout de SID à un contexte client

Mise en cache des vérifications d’accès

Initialisation d’un contexte client

Interrogation d’un contexte client