액세스 검사 캐싱
애플리케이션이 AuthzAccessCheck 함수를 호출하여 액세스 검사 수행하는 경우 해당 액세스 검사 결과를 캐시할 수 있습니다. AuthzAccessCheck 함수의 pAuthzHandle 매개 변수가 NULL이 아닌 경우 함수는 요청된 ACCESS_MASK MAXIMUM_ALLOWED 사용하여 별도의 액세스 검사 수행하고 해당 검사 결과를 캐시합니다. 그런 다음, 해당 검사 결과에 대한 핸들을 AuthzCachedAccessCheck 함수에 AuthzHandle 매개 변수로 전달할 수 있습니다. 이렇게 하면 지정된 클라이언트 및 보안 설명자에 대한 액세스 검사가 더 빨라집니다.
액세스 검사 정적 부분만 캐시할 수 있습니다. PRINCIPAL_SELF SID를 포함하는 모든 AES(콜백 액세스 제어 항목) 또는 ACE는 각 액세스 검사 대해 평가되어야 합니다.
특성 변수는 논리 연산자에서 사용할 때 식 형식이어야 합니다. 그렇지 않으면 알 수 없는 것으로 평가됩니다.
예제
다음 예제에서는 이전 액세스 검사 캐시된 결과에 대한 액세스를 확인합니다. 이전 액세스 검사 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;
}
관련 항목