【问题标题】:Use Authorization Filters or parameter loading to overload action methods使用授权过滤器或参数加载来重载操作方法
【发布时间】:2012-12-10 23:07:47
【问题描述】:

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

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

[MangersOnly]
public ActionResult Index()
{
}


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

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

我遗憾地发现,属性并不能作为我的操作方法的重载。

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

有没有一种方法可以重载这些方法(不更改它们的参数或名称),保持这种甜美(虽然幼稚)的架构来引导用户?

【问题讨论】:

  • 您对 Post 操作有错误的理解。使用 HttpPost 不允许您创建相同的方法。您必须区分它们,通常是通过接受参数中的模型。

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


【解决方案1】:

在 C#(以及我能想到的任何其他语言)中,您不能拥有多个具有相同签名的方法(无论是否 MVC)(属性不是签名的一部分);所以这种方法行不通。

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

或者使用基本控制器来实现通用功能并继承每个安全级别的行为。

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

【讨论】:

  • 我喜欢这篇文章。您更改导航链接和封装功能的想法说明了我们正在做的大部分事情。但是我们不可避免地会问“如果用户点击了他们不应该点击的页面怎么办?”简短的回答是,他们不会。长答案是,O,创建所有逻辑以将它们重定向到它们应该在的位置。所以基于权限的逻辑是我们的规则,但它并没有涵盖所有的意外情况。
  • 最后,权限并不能免除我们的保护逻辑,以防管理员点击经理 uri。我们会在可能的情况下逐页调整基于角色的考虑。但在许多情况下,经理页面不适合管理员,反之亦然。
【解决方案2】:

如果应用程序的外观和感觉因用户而异,那么您始终可以利用 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

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2021-07-18
    • 2016-05-10
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多