Freigeben über


Zwischenspeichern von Zugriffsprüfungen

Wenn eine Anwendung eine Zugriffsüberprüfung durch Aufrufen der AuthzAccessCheck-Funktion durchführt, können die Ergebnisse dieser Zugriffsprüfung zwischengespeichert werden. Wenn der pAuthzHandle-Parameter der AuthzAccessCheck-Funktion nicht NULL ist, führt die Funktion eine separate Zugriffsüberprüfung mit einer angeforderten ACCESS_MASK von MAXIMUM_ALLOWED durch und speichert die Ergebnisse dieser Überprüfung zwischen. Ein Handle für die Ergebnisse dieser Überprüfung kann dann als AuthzHandle-Parameter an die AuthzCachedAccessCheck-Funktion übergeben werden. Dies ermöglicht eine schnellere Zugriffsüberprüfung für einen bestimmten Client und Sicherheitsbeschreibungen.

Nur der statische Teil einer Zugriffsprüfung kann zwischengespeichert werden. Alle Rückrufzugriffssteuerungseinträge (ACEs) oder ACEs, die die PRINCIPAL_SELF SID enthalten, müssen für jede Zugriffsprüfung ausgewertet werden.

Attributvariablen müssen in Form eines Ausdrucks vorliegen, wenn sie mit logischen Operatoren verwendet werden. andernfalls werden sie als unbekannt ausgewertet.

Beispiel

Im folgenden Beispiel wird der Zugriff anhand eines zwischengespeicherten Ergebnisses aus einer vorherigen Zugriffsprüfung überprüft. Die vorherige Zugriffsüberprüfung wurde im Beispiel unter Überprüfen des Zugriffs mit der Authentifizierungs-API durchgeführt.

BOOL CheckCachedAccess(AUTHZ_CLIENT_CONTEXT_HANDLE hClientContext)
{
    #define MY_MAX 4096


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

    //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 initial 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;

    //Allocate memory for the cached access reply structure.
    RtlZeroMemory(ReplyBuffer, MY_MAX);

    //Set up the cached access reply structure.
    pCachedReply->ResultListLength = 1;
    pCachedReply->Error = (PDWORD) ((PCHAR) pCachedReply + sizeof(AUTHZ_ACCESS_REPLY));
    pCachedReply->GrantedAccessMask = (PACCESS_MASK) (pCachedReply->Error + pCachedReply->ResultListLength);
    pCachedReply->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 and cache results.
    if(!AuthzAccessCheck(
        0,
        hClientContext,
        &Request,
        NULL,
        pSecurityDescriptor,
        NULL,
        0,
        pReply,
        &hCached))
    {
        printf_s("AuthzAccessCheck failed with %d\n", GetLastError());
        
    LocalFree(pSecurityDescriptor);
        
        return FALSE;
    }

    //Call AuthzCachedAccessCheck with the cached result from the previous call.
    if(!AuthzCachedAccessCheck(
        0,
        hCached,
        &Request,
        NULL,
        pCachedReply))
    {
        printf_s("AuthzCachedAccessCheck failed with %d\n", GetLastError());
        
        LocalFree(pSecurityDescriptor);
    AuthzFreeHandle(hCached);
    
        return FALSE;
    }

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


  LocalFree(pSecurityDescriptor);
  AuthzFreeHandle(hCached);
    return TRUE;

}

Hinzufügen von SIDs zu einem Clientkontext

Überprüfen des Zugriffs mit der Authentifizierungs-API

Initialisieren eines Clientkontexts

Abfragen eines Clientkontexts