Kentico UserInfoProvider.IsAuthorizedPerClass 未按预期工作

Kentico UserInfoProvider.IsAuthorizedPerClass not working as expected

我正在尝试检查给定用户是否有权访问特定自定义 Table。 基于 check permissions for a custom table 的 kentico 文档中列出的示例,我设置了一个类似的调用,使用我的自定义 table class 名称和用户信息,但对 "UserInfoProvider.IsAuthorizedPerClass" 的调用总是return 错误:

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;
}

除了 "Read" 之外,还有谁能提到有效的权限名称字符串是什么? (例如:"Modify"?"Delete"?"Insert"?)

UserInfoProvider.IsAuthorizedPerClass 是解析给定用户的所有成员资格,还是只检查用户是否明确添加到自定义 Table?

有什么建议吗?我们正在使用 Kentico v8.2.25

谢谢!

维克多

编辑:

我,笨蛋。您正在为用户参数分配默认值,而不是自动分配的值。我仍然会检查以确保您获得了您期望的用户信息,因为这似乎是最有可能导致问题的原因。

您似乎 运行 遇到了问题:

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;
    }
}

所以你的方法总是return false。

IsAuthorizedPerClass() 函数仅检查用户对您提供的 class 的权限进行检查,并且仅检查您提供的特定权限进行检查(例如 "Read")。所以是的,它只会查看用户是否具有您自定义 table.

的读取权限

我不是 100% 确定所有权限是什么,尽管它似乎存储在枚举中。我会尽快回复你。希望这有帮助:)

IsAuthorizedPerClass() 方法 return 仅当用户的角色已被授予 明确地 在该 class 角色的权限内时才为真.所有其他时候,即使用户实际上能够 Read/Modify/etc,它也会 return false。习俗 table.

要获得正确的权限字符串,您可以使用CMS.DataEngine.PermissionsEnum.<type>.ToString()

要检查用户是否有权读取特定自定义 table,您需要按顺序进行以下 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)

如果按照

中的方式来做呢?

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。 (读取、修改、创建、删除、销毁)