Almacenamiento en caché de comprobaciones de acceso
Cuando una aplicación realiza una comprobación de acceso mediante una llamada a la función AuthzAccessCheck , los resultados de esa comprobación de acceso se pueden almacenar en caché. Cuando el parámetro pAuthzHandle de la función AuthzAccessCheck no es NULL, la función realiza una comprobación de acceso independiente, con una ACCESS_MASK solicitada de MAXIMUM_ALLOWED y almacena en caché los resultados de esa comprobación. A continuación, se puede pasar un identificador a los resultados de esa comprobación como parámetro AuthzHandle a la función AuthzCachedAccessCheck . Esto permite una comprobación de acceso más rápida para un cliente determinado y descriptores de seguridad.
Solo se puede almacenar en caché la parte estática de una comprobación de acceso. Todas las entradas de control de acceso de devolución de llamada (ACE) o ACE que contengan el SID de PRINCIPAL_SELF deben evaluarse para cada comprobación de acceso.
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.
Ejemplo
En el ejemplo siguiente se comprueba el acceso a un resultado almacenado en caché de una comprobación de acceso anterior. La comprobación de acceso anterior se realizó en el ejemplo de Comprobación del acceso con authz API.
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;
}
Temas relacionados