6

我正在为我的 asp.net mvc 项目使用角色管理器和 windows 身份验证,我们有 2 个角色,它们是 viewers 和 Editors 。

    <authentication mode="Windows" />
    <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
        <providers>
          <clear />
          <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </providers>
    </roleManager>

编辑器可以访问整个应用程序,但查看器只能访问两个操作

我首先尝试为基本控制器设置 Authorize 属性,它只允许编辑器访问所有内容:

[Authorize(Roles = "Editors")]
public class BaseController : Controller

然后将 Authorize 属性添加到这两个操作:

[Authorize(Roles = "Viewers,Editors")]
public ActionResult Report(PaymentsUnallocatedAndQueriedModel model)

它不起作用,它不允许查看者访问任何现在有意义的操作。

我认为在每个操作的顶部重复 Authorize 属性并不是一个好主意。

你能告诉我是否有更好的解决方案

4

1 回答 1

5

你必须从树的角度来看这个。为了获得一个动作,你必须首先能够获得一个控制器。在这种情况下,您已将控制器限制在 Editors 组中,因此 Viewers 甚至无法做到这一点。最有可能更有帮助的是将控制器限制在Viewers, Editors仅需要编辑权限的操作中,然后指定这些操作。这将生成冗余属性,但如果您必须根据角色成员身份手动限制每个操作,请考虑代码成本。

[Authorize(Roles = "Viewers, Editors")]
public class BaseController : Controller
{

    [Authorize(Roles = "Editors")]
    public ActionResult EditReport(PaymentsUnallocatedAndQueriedModel model)
    {
        // Some editor only functionality
    }

    public ActionResult Report(PaymentsUnallocatedAndQueriedModel model)
    {
        // Some functionality for both. No attribute needed
    }
}
于 2012-08-29T14:08:38.900 回答