Asp.net mvc 如何有效地检查更新操作的用户权限

Asp.net mvc 如何有效地检查更新操作的用户权限,asp.net-mvc,action-filter,Asp.net Mvc,Action Filter,我开始写我自己的动作过滤器,我不得不说这个功能非常好。然而,我对一个设计问题感到困惑。当我们对超级市场中的产品进行CRUD操作时,操作方法如下所示: public ActionResult CreateProduct(int ShopID); // Users within specific role for that shop public ActionResult GetProduct(int ProductID); // Everybody can do public ActionResu

我开始写我自己的动作过滤器,我不得不说这个功能非常好。然而,我对一个设计问题感到困惑。当我们对超级市场中的产品进行CRUD操作时,操作方法如下所示:

public ActionResult CreateProduct(int ShopID); // Users within specific role for that shop
public ActionResult GetProduct(int ProductID); // Everybody can do
public ActionResult UpdateProduct(int ProductID); // Users within specific role for that shop
public ActionResultat DeleteProduct(int ProductID); //Users within specific role for that shop
我的问题是,我在此应用程序中没有全局角色。这里的角色仅限于特定的上下文:在商店a中是管理员的用户可能不是商店B中的管理员。所以我的问题来了。在我的授权过滤器中,我可以轻松地检查当前用户对CreateProduct操作的权限,因为商店的ID是传入参数的

对于GetProduction操作,问题开始出现,但它是可以管理的,因为每个人都应该有权访问该操作。但是,对于更新和删除操作,我如何知道当前用户的权限,因为我不知道产品属于哪个商店

好的,关键是我的过滤器应用于在各种存储库上工作的操作,而不仅仅是产品,所以我不能说“如果操作名称包含单词Update,请在产品存储库中检索相应的商店”。到目前为止,我设想了两种解决方案

  • 在我的筛选器中检查操作的名称并手动处理每个案例。(对我来说,这是一个非常糟糕的解决方案)
  • 将产品ID和店铺ID作为参数传递给我的操作,但我觉得这不是正常的方式。我觉得这样做会引入某种冗余,我不知道这是否是一种常见的做法
  • 怎么走?(请不要告诉我要添加3层和工厂图案,我是一名初级设计师,上个月我一直在尝试最先进的设计。现在很不错,但我真的不能再花更多的时间深刻地改变设计了)


    谢谢大家!

    由于您需要从数据库访问特定的业务实体以检查此访问权限,我认为您不能有效地将其作为操作过滤器

    您可能需要某种“
    IsUserInRoleForShop(role,shop)
    ”方法,可以从需要检查它的方法中调用它(因为这些方法似乎只是从您的代码库中选择的)


    您需要查询数据库以获取店铺ID(我想您可能需要这样做才能正确更新模型中的实体).传递店铺ID是一个坏主意,因为没有验证,你就可以让某人摆弄帖子来传递他们的店铺ID和其他人的产品ID。

    谢谢,实际上我误读了你的答案。我刚刚编辑了那条评论。因此无法将所有授权逻辑从控制器中移出?谢谢你的提示o关于在URL中传递店铺ID!!知道这一点非常重要,我没有想到。很难全部删除,特别是当您将根据要访问的内容拥有不同的授权规则时。如果运行身份验证的代码很常见,那么至少不会分散在您的应用程序中代码库。