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;
}
Zugehörige Themen