Freigeben über


Überprüfen des Zugriffs mit der Authentifizierungs-API

Anwendungen bestimmen, ob der Zugriff auf sicherungsfähige Objekte gewährt werden soll, indem die AuthzAccessCheck-Funktion aufgerufen wird .

Die AuthzAccessCheck-Funktion akzeptiert sowohl AUTHZ_ACCESS_REQUEST - als auch SECURITY_DESCRIPTOR-Strukturen als Parameter. Die AUTHZ_ACCESS_REQUEST-Struktur gibt eine angeforderte Zugriffsebene an. Die AuthzAccessCheck-Funktion wertet den angeforderten Zugriff anhand der angegebenen SECURITY_DESCRIPTOR für einen angegebenen Clientkontext aus. Informationen dazu, wie ein Sicherheitsdeskriptor den Zugriff auf ein Objekt steuert, finden Sie unter Steuern des Zugriffs auf ein Objekt durch DACLs.

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

Rückruffunktion

Wenn die diskretionäre Zugriffssteuerungsliste (Discretionary Access Control List , DACL) des SECURITY_DESCRIPTOR des zu überprüfenden Objekts alle Rückrufzugriffssteuerungseinträge (ACEs) enthält, ruft AuthzAccessCheckCheckCallback die AuthzAccessCheckCallback-Funktion für jeden in der DACL enthaltenen Rückruf-ACE auf. Ein Rückruf-ACE ist eine beliebige ACE-Struktur, deren ACE-Typ das Wort "Rückruf" enthält. Die AuthzAccessCheckCallback-Funktion ist eine anwendungsdefinierte Funktion, die registriert werden muss, wenn der Ressourcen-Manager durch Aufrufen der AuthzInitializeResourceManager-Funktion initialisiert wird.

Eine Rückruffunktion ermöglicht es einer Anwendung, Geschäftslogik zu definieren, die zur Laufzeit ausgewertet werden soll. Wenn die AuthzAccessCheckCallback-Funktion aufgerufen wird, wird der Rückruf-ACE, der den Aufruf verursacht hat, zur Auswertung an die Rückruffunktion übergeben. Wenn die anwendungsdefinierte Logik als TRUE ausgewertet wird, wird der Rückruf ACE in die Zugriffsprüfung einbezogen. Andernfalls wird sie ignoriert.

Zwischenspeichern von Zugriffsergebnissen

Die Ergebnisse einer Zugriffsprüfung können zwischengespeichert und in zukünftigen Aufrufen der AuthzCachedAccessCheck-Funktion verwendet werden. Weitere Informationen zum Zwischenspeichern von Zugriffsprüfungen, einschließlich eines Beispiels, finden Sie unter Zwischenspeichern von Zugriffsprüfungen.

Beispiel

Im folgenden Beispiel wird eine SECURITY_DESCRIPTOR erstellt, die READ_CONTROL Zugriff auf integrierte Administratoren ermöglicht. Er verwendet diesen Sicherheitsdeskriptor, um den Zugriff auf den Client zu überprüfen, der durch den Clientkontext angegeben wird, der im Beispiel in Initializing a Client Context erstellt wurde.

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;

}

Hinzufügen von SIDs zu einem Clientkontext

Zwischenspeichern von Zugriffsprüfungen

Initialisieren eines Clientkontexts

Abfragen eines Clientkontexts