Поделиться через


Проверка доступа с помощью API Authz

Приложения определяют, следует ли предоставлять доступ к защищаемым объектам, вызывая функцию AuthzAccessCheck .

Функция AuthzAccessCheck принимает как AUTHZ_ACCESS_REQUEST , так и SECURITY_DESCRIPTOR структуры в качестве параметров. Структура AUTHZ_ACCESS_REQUEST определяет запрошенный уровень доступа. Функция AuthzAccessCheck оценивает запрошенный доступ по указанному SECURITY_DESCRIPTOR для указанного контекста клиента. Сведения о том, как дескриптор безопасности управляет доступом к объекту, см. в разделе Управление доступом к объекту служб DACLs.

Переменные атрибута должны иметь форму выражения при использовании с логическими операторами; В противном случае они оцениваются как неизвестные.

Функция Callback

Если список управления доступом на уровне пользователей (DACL) SECURITY_DESCRIPTOR проверяемого объекта содержит все записи управления доступом обратного вызова (ACE), AuthzAccessCheck вызывает функцию AuthzAccessCheckCallback для каждого ACE обратного вызова, содержащегося в DACL. ACE обратного вызова — это любая структура ACE, тип которой содержит слово "callback". Функция AuthzAccessCheckCallback — это определяемая приложением функция, которая должна быть зарегистрирована при инициализации диспетчера ресурсов путем вызова функции AuthzInitializeResourceManager .

Функция обратного вызова позволяет приложению определять бизнес-логику для оценки во время выполнения. При вызове функции AuthzAccessCheckCallback ACE обратного вызова, вызвавшего вызов, передается функции обратного вызова для оценки. Если логика, определяемая приложением, имеет значение TRUE, то ACE обратного вызова включается в проверка доступа. В других случаях он игнорируется.

Кэширование результатов доступа

Результаты проверка доступа можно кэшировать и использовать в будущих вызовах функции AuthzCachedAccessCheck. Дополнительные сведения о кэшировании проверок доступа, включая пример, см. в разделе Кэширование проверок доступа.

Пример

В следующем примере создается SECURITY_DESCRIPTOR , которая позволяет READ_CONTROL доступ встроенным администраторам. Он использует этот дескриптор безопасности для проверка доступа для клиента, указанного в контексте клиента, созданном в примере в разделе Инициализация контекста клиента.

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;

}

Добавление идентификаторов безопасности в контекст клиента

Кэширование проверок доступа

Инициализация контекста клиента

Запрос контекста клиента