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;
}
Rubriques connexes