使用授权过滤器或参数加载来重载操作方法

时间:2012-12-10 23:07:47

标签: asp.net-mvc asp.net-mvc-4

我们的网站具有复杂的管理层次结构,并且存在一些行为拆分。为了最好地引导用户流量,我创建了名为MangersOnly,AdminOnly,NonAdmins的授权过滤器。

我设想以这种方式使用它们

[MangersOnly]
public ActionResult Index()
{
}


[AdminOnly]
public ActionResult Index()
{
      return redirectoaction("Index", "Admins");
}

[NonAdmins]
public ActionResult Index()
{
      return redirectoaction("Shouldntbehere", "Errors");
}

我遗憾地发现,属性并不会影响我的行动方法。

这种架构是为了避免我们必须做的所有逻辑检查(如果角色这个或那个停留,否则重定向到这里或那里......)。目标是将流量引导到授权属性不会失败的操作方法。

有没有办法可以重载这些方法(不改变它们的参数或名称),保持这种甜蜜(天真)的架构来引导用户?

2 个答案:

答案 0 :(得分:1)

在C#(和我能想到的任何其他语言)中,你不能有多个具有相同签名的方法(MVC或不具有)(属性不是签名的一部分);所以这种做法无法奏效。

如何根据用户的权限生成视图中的锚链接()),例如IndexManager,IndexAdmin等,并正常添加基于角色的安全性。名称IndexManager在这里没有意义,这会让我更多地考虑用户在做什么,这是一个更好的名称吗?只有您知道自己的域名才能回答这个问题。

或者使用基本控制器获取常用功能,并继承每个安全级别行为。

您可能还想考虑基于权限的过滤而非基于角色,请参阅http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/

答案 1 :(得分:0)

如果应用程序的外观和感觉因用户而异,则可以始终使用MVC区域。我开发了几个应用程序,我使用此功能,基于登录,将用户定向到特定区域,并定制所有内容访问和交付给特定用户组。

例如,我有一个网站,其中有一个登录,并且根据您是谁(客户支持或客户),您被定向到不同的区域,这些区域都使用相同的DAL逻辑来获取信息,但控制器可以过滤它给了该地区。这也使得将营销材料与订单服务和其他处理逻辑分开非常容易。我非常喜欢这些文章:

MVC5区域 - http://www.itorian.com/2013/10/area-in-mvc-5-with-example-step-by-step.html

基于登录的重定向 - ASP.NET MVC 5 Identity 2 Login redirect based on user role