Controllo dell'accesso con l'API Authz
Le applicazioni determinano se concedere l'accesso a oggetti a protezione diretta chiamando la funzione AuthzAccessCheck .
La funzione AuthzAccessCheck accetta sia AUTHZ_ACCESS_REQUEST che SECURITY_DESCRIPTOR strutture come parametri. La struttura AUTHZ_ACCESS_REQUEST specifica un livello di accesso richiesto. La funzione AuthzAccessCheck valuta l'accesso richiesto rispetto al SECURITY_DESCRIPTOR specificato per un contesto client specificato. Per informazioni sul modo in cui un descrittore di sicurezza controlla l'accesso a un oggetto, vedere How DACLs Control Access to an Object .For information about how a security descriptor controls access to an Object, see How DACLs Control Access to an Object.
Le variabili di attributo devono essere sotto forma di un'espressione quando viene usata con operatori logici; in caso contrario, vengono valutati come sconosciuti.
Funzione di callback
Se l'elenco di controllo di accesso discrezionale (DACL) dell'SECURITY_DESCRIPTOR dell'oggetto da controllare contiene tutte le voci del controllo di accesso di callback (ACEs), AuthzAccessCheck chiama la funzione AuthzAccessCheckCallback per ogni ace di callback contenuto nell'elenco dati. Un callback ACE è qualsiasi struttura ACE il cui tipo ACE contiene la parola "callback". La funzione AuthzAccessCheckCallback è una funzione definita dall'applicazione che deve essere registrata quando gestione risorse viene inizializzata chiamando la funzione AuthzInitializeResourceManager .
Una funzione di callback consente a un'applicazione di definire la logica di business da valutare in fase di esecuzione. Quando viene chiamata la funzione AuthzAccessCheckCallback , il callback ACE che ha causato il passaggio della chiamata alla funzione di callback per la valutazione. Se la logica definita dall'applicazione valuta come TRUE, il callback ACE viene incluso nel controllo di accesso. In caso contrario, viene ignorata.
Memorizzazione nella cache dei risultati dell'accesso
I risultati di un controllo di accesso possono essere memorizzati nella cache e usati nelle chiamate future alla funzione AuthzCachedAccessCheck . Per altre informazioni sui controlli di accesso nella cache, tra cui un esempio, vedere Memorizzazione nella cache dei controlli di accesso.
Esempio
Nell'esempio seguente viene creato un SECURITY_DESCRIPTOR che consente READ_CONTROL l'accesso agli amministratori predefiniti. Usa tale descrittore di sicurezza per controllare l'accesso per il client specificato dal contesto client creato nell'esempio in Inizializzazione di un contesto 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;
}
Argomenti correlati