Asp.net MVC 角色管理器

6

我正在使用角色管理和Windows身份验证来完成我的ASP.NET MVC项目,我们有两个角色,即观看者和编辑者。

    <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)

它无法正常工作,不允许查看者访问任何有意义的操作。

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

请告诉我是否有更好的解决方案。

1个回答

5
你需要从树的角度来看待这个问题。为了执行一个操作,你必须先能够进入控制器。在这种情况下,你已经将控制器限制为编辑组,因此查看者甚至无法到达那里。更有帮助的做法可能是将控制器限制为“查看者、编辑者”,然后在需要仅编辑者权限的操作中指定这些权限。这将生成冗余属性,但考虑到如果你必须根据角色成员身份手动限制每个操作的代码成本,这样做更加划算。
[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
    }
}

谢谢您的回答,我希望不必在每个操作的顶部重复授权,因为编辑可以访问每个操作,但似乎没有其他方法。 - Elham
@Elham:你可以看一下这个SO问题并实现一个拒绝属性。虽然这样做只是因为你不想为一个方法输入属性,但这似乎需要很多工作。https://dev59.com/aVHTa4cB1Zd3GeqPQ2CB - Joel Etherton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接