在 Kentico 中,除非用户处于特定角色,否则拒绝访问单个页面

In Kentico deny access to a single page unless a use is in a particular role

我一直在努力将我的 Kentico 安装中的一个页面限制为只能由两个角色查看,其他所有人都应该被重定向到一个页面,告诉他们他们需要跳过付费专区。我还没有确定最好的方法来做到这一点。一路上我发现,当我尝试从页面顶部的菜单访问该页面时,它通过拒绝访问来尊重我的许可。但是,当我在页面下方的可编辑 Web 部件中使用相同的 link 时,它似乎忽略了权限。虽然这里看起来有两个问题,但我真正想知道的是如何拒绝访问,除非用户处于特定角色,然后如果被拒绝,我如何将他们重定向到一个页面以解释他们被拒绝的原因。谢谢。

如果我没理解错的话,你是说你已经将一个页面锁定为只有 2 个角色?如果有人点击不属于这些角色的导航 link,他们将被拒绝访问……对吗?但是,如果某人从页面上的 Web 部件单击 link,他们不会被拒绝访问……对吗?

哪里不寻常我还想知道 link 在 Web 部件中是如何设置的?它只是一个锚 link 还是您使用的是 Kentico permalink?这些应该没有任何不同的行为,而只是一个想法。听起来很可能有一些权限仍然允许访问该页面,但在没有看到您的实际权限设置的情况下,很难告诉您是什么导致了这种情况。

就重定向而言,如果您有其中一项设置(您可以在“设置”选项卡中进行设置),默认情况下它应该重定向到登录页面,否则访问被拒绝就会发生。您可以很容易地编写一些自定义代码,将不属于某个角色的用户重定向到另一个页面。为了可重用性,您可以将其写入自定义 Web 部件,并为用户需要的角色设置一个 属性,为重定向页面位置设置一个 属性,然后从那里进行处理。这样做可以让你在任何你想要的页面上使用相同的模式......但是你需要绕过内置的安全锁定东西。

最后(我不知道要使用 classes)你可能会覆盖在访问网站页面时发生 'access denied' 时发生的事情..然后你可以做你的自己的自定义重定向。我相信其他人可以准确地插话 class.

试试这个:

在您的顶级页面(母版页)中,添加角色 "Everyone" 并授予他们读取权限。这将复制到其余页面,每个人都可以看到所有内容。是的,听起来很可疑,但请继续阅读...

接下来导航到您要限制访问的特定页面。在“安全”选项卡上,单击 "Change permission inheritance" link。然后单击"Break inheritance and copy parent permissions"。接下来 select Everyone 角色并选中拒绝完全控制框。

现在添加您的特定角色并将其权限设置为读取。

这应该让您的权限按照您对该页面的需要工作。

至于消息和重定向(如果处于特定角色),您可以在页面上放置一个 Web 部件并说明如果它们不属于某个角色,只需使用您选择的重定向将它们重定向到页面。 Web 部件本身将处理它们是否处于特定角色。请记住,用户必须已经登录 and/or 才能访问该页面,因此该页面上没有任何限制。

感谢您的所有建议。这是我发现的。首先,这两个页面表现不同的原因是我脑抽筋了。我嵌入了两个不同的链接。我的错!

其次,在安全方面,似乎 Deny 优先于 Allow。如果角色被拒绝,再多的 "allow" 也不会覆盖拒绝。我解决问题的方法是为那些我想允许访问文本的人创建一个区域,为我想拒绝的人创建一个区域或 Web 部件。在区域可见性部分(单击 "Visible" 旁边的箭头输入文本)我放置了一个布尔语句:

{% CurrentUser.IsInRole("Member") || CurrentUser.IsInRole("SecondRoleToTest") #%}

这样,任何属于这两个组中的任何一个组的人都会对这个语句产生一个真值,而 visible 将等于 true(注意“!”)。对于区域或 Web 部分,我想向那些不属于其中任何一个组的人展示,我将其与该条件相反

{% !(CurrentUser.IsInRole("Member") || CurrentUser.IsInRole("SecondRoleToTest")) #%}

它会为那些不在这两个组中的人显示材料。在这种情况下,文本相当于 "you need to be either this or that with a link to information on how they could become this or that"。不得不承认我在这方面学到了很多东西。感谢您的所有帮助,您帮助我找到了答案。