2012-08-29 152 views
6

我为我的asp.net mvc项目 使用角色管理器和Windows身份验证,我们有2个角色是查看器和编辑器。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(Roles = "Editors")] 
public class BaseController : Controller 

和然后向这两个动作添加授权属性:

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

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

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

你能告诉我,如果有一个更好的解决这一

回答

5

你必须看看这个树上的观点。为了得到一个动作,你必须先能够找到一个控制器。在这种情况下,您已将控制器限制为编辑组,因此观看者甚至无法实现这一目标。最有可能更有用的方法是将控制器限制为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 
    } 
} 
+0

谢谢您的回答,我希望不要重复授权对每个动作的顶部,因为编辑可以访问每一个行动,但似乎没有其他办法 – Elham

+0

@Elham:你总是可以看看这个SO问题并实施拒绝属性。这看起来像很多工作,只是因为你不想为方法输入一个属性。 http://stackoverflow.com/questions/4011458/mvc-authorize-attribute-deny –