Kentico UserInfoProvider.IsAuthorizedPerClass не работает должным образом

Я пытаюсь проверить, есть ли у данного пользователя доступ к определенной пользовательской таблице. На основе примера, приведенного в документации Kentico, для проверки разрешений для пользовательского table, я настроил аналогичный вызов, используя собственное имя класса таблицы и информацию о пользователе, но вызов «UserInfoProvider.IsAuthorizedPerClass» всегда возвращает false:

private bool CheckCustomTableReadPermission(UserInfo user = null)
{
    // Gets the user object
    //UserInfo user = UserInfoProvider.GetUserInfo("CMSEditor");
    //UserInfo user = UserInfoProvider.GetUserInfo("someothervalidusername");
    //UserInfo user = CurrentUser;

    //normally outside of this function
    UserInfo CurrentUser = MembershipContext.AuthenticatedUser;
    string CustomTableClassName = "Namespc.TblName";

    if (user == null)
    {
        user = CurrentUser;
    }

    if (user != null)
    {
        // Checks whether the user has the Read permission for the CMS.MenuItem page type
        if (UserInfoProvider.IsAuthorizedPerClass(CustomTableClassName, "Read", SiteContext.CurrentSiteName, user))
        {
            // Perform an action according to the result
            return true;
        }
    }

    return false;
}

Может ли кто-нибудь также упомянуть, что такое допустимые строки имени разрешения, кроме «Чтение»? (например: «Изменить»? «Удалить»? «Вставить»?)

Разрешает ли UserInfoProvider.IsAuthorizedPerClass все членства данного пользователя или только проверяет, добавлен ли пользователь в пользовательскую таблицу явно?

Какие-либо предложения? Мы используем Kentico v8.2.25

Спасибо!

Виктор


person victor_c    schedule 08.12.2015    source источник


Ответы (3)


Как насчет того, чтобы сделать это так же, как это делается в

CMS\CMSModules\CustomTables\Tools\CustomTable_Data_EditItem.aspx.cs

который:

DataClassInfo dci = DataClassInfoProvider.GetDataClassInfo(customTableId);
dci.CheckPermissions(PermissionsEnum.Read, SiteContext.CurrentSiteName, MembershipContext.AuthenticatedUser)

А возможные разрешения находятся в CMS.DataEngine.PermissionsEnum. (Чтение, изменение, создание, удаление, уничтожение)

person rocky    schedule 08.12.2015
comment
Спасибо, Рокки! Это лучшая реализация, чем путь, по которому мы начали. На самом деле мы собираемся получить CustomTable по имени класса, а затем вызвать CheckPermissions для объекта пользовательской таблицы. Это больше соответствует тому, как мы изначально хотели (ожидали) работать с этими данными. - person victor_c; 09.12.2015

ИЗМЕНИТЬ:

Я тупой. Вы назначаете значение по умолчанию пользовательскому параметру, а не автоматически назначаемое значение. Я бы все же проверил, чтобы убедиться, что вы получаете ожидаемую информацию о пользователе, потому что это кажется наиболее вероятной причиной проблемы.

Кажется, вы столкнулись с проблемой здесь:

private bool CheckCustomTableReadPermission(UserInfo user = null)

Поскольку вы автоматически присваиваете параметру user значение null при вызове вашего метода, следующее утверждение всегда будет истинным:

if (user == null)
{
    user = CurrentUser;
}

И вы никогда не дойдете до другого вашего утверждения:

if (user != null)
{
    // Checks whether the user has the Read permission for the CMS.MenuItem page type
    if (UserInfoProvider.IsAuthorizedPerClass(CustomTableClassName, "Read", SiteContext.CurrentSiteName, user))
    {
        // Perform an action according to the result
        return true;
    }
}

Так что ваш метод всегда будет возвращать false.

Функция IsAuthorizedPerClass() проверяет только разрешения пользователя для класса, который вы предоставляете для проверки, и только конкретное разрешение, которое вы предоставляете для проверки (например, «Чтение»). Так что да, он только увидит, есть ли у пользователя разрешение на чтение для вашей пользовательской таблицы.

Я не уверен на 100%, каковы все разрешения, хотя, похоже, они хранятся в перечислении. Я вернусь к вам через некоторое время. Надеюсь это поможет :)

person Jerreck    schedule 08.12.2015
comment
Привет, Джеррек, я также попытался просто жестко закодировать строку для имени пользователя и подтвердил, что получаю правильную информацию о пользователе, и проверил во время отладки, что я получаю действительную информацию о пользователе. Похоже, что UserInfoProvider.IsAuthorizedPerClass неправильно оценивает разрешения. Например, я проверяю, используя свое имя пользователя (у которого должен быть доступ в качестве глобального администратора), но UserInfoProvider.IsAuthorizedPerClass оценивается как false. Обратите внимание, что сам объект пользователя не имеет разрешения явно, но через роли - это будет иметь место для всех других пользователей в нашей системе (не администратор) - person victor_c; 08.12.2015
comment
Хм, вы пытались проверить пользователя с правильными ролями, у которого есть права на чтение таблицы, а не с правами глобального администратора? На самом деле это может быть проблемой - я никогда не тестировал с глобальным администратором. Этот метод должен перебирать роли, связанные с пользователем, и проверять разрешения ролей. Извините, если это не было ясно из моего ответа. - person Jerreck; 08.12.2015

Метод IsAuthorizedPerClass() вернет значение true, только если роли пользователя предоставлено разрешение явно в рамках разрешений роли для этого класса. Во всех остальных случаях он вернет false, даже если пользователь действительно может читать/изменять/и т. д. пользовательская таблица.

Чтобы получить правильные строки разрешений, вы можете использовать CMS.DataEngine.PermissionsEnum.<type>.ToString()

Чтобы проверить, есть ли у пользователя разрешения на чтение определенной пользовательской таблицы, вам необходимо выполнить следующие 3 проверки по порядку:

UserInfoProvider.IsAuthorizedPerUIElement("CMS.CustomTables","CustomTables",SiteContext.CurrentSiteName,user)
UserInfoProvider.IsAuthorizedPerResource("CMS.CustomTables", PermissionsEnum.Read.ToString(), SiteContext.CurrentSiteName, user)
UserInfoProvider.IsAuthorizedPerClass(CustomTableClassName, PermissionsEnum.Read.ToString(), SiteContext.CurrentSiteName, user)
person EricD    schedule 08.12.2015
comment
Похоже, мне нужно ИЛИ последние 2 вызова, чтобы гарантировать, что данный пользователь имеет доступ к настраиваемой таблице. Если я вызову их последовательно, то произойдет сбой, так как последней проверкой будет проверка того, были ли явно заданы пользователь/роль для таблицы. Мне кажется, что метод IsAuthorizedPerClass работает со сбоями и на самом деле должен выполнять эту оценку: ToString(), SiteContext.CurrentSiteName, пользователь) - person victor_c; 09.12.2015