Kentico UserInfoProvider.IsAuthorizedPerClass未按预期工作

时间:2015-12-08 13:33:47

标签: c# api kentico

我正在尝试检查给定用户是否可以访问特定的自定义表。 根据{{​​3}}的kentico文档中列出的示例,我使用自定义表类名和userinfo设置了类似的调用,但对“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

谢谢!

维克多

3 个答案:

答案 0 :(得分:2)

以与在

中完成相同的方式做到这一点
  

CMS \ CMSModules \ CustomTables \工具\ CustomTable_Data_EditItem.aspx.cs

是:

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

可能的权限位于CMS.DataEngine.PermissionsEnum。 (阅读,修改,创建,删除,销毁)

答案 1 :(得分:1)

修改

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

你似乎遇到了一个问题:

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()函数仅检查用户检查的类的用户权限,并仅检查您为其提供检查的特定权限(例如" Read")。所以,是的,它只会查看用户是否具有自定义表的读取权限。

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

答案 2 :(得分:1)

{{1>}方法仅在用户的角色在该角色的权限中明确授予 权限时才会返回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)