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