相关疑难解决方法(0)

ASP.NET MVC中的访问控制取决于输入参数/服务层?

序言:这是一个哲学问题.我正在寻找更好的"正确"方式来做到这一点而不是"一种"方式来做到这一点.

让我们假设我有一些产品,以及在这些产品上执行CRUD的ASP.NET MVC应用程序: -

mysite.example/products/1
mysite.example/products/1/edit
Run Code Online (Sandbox Code Playgroud)

我正在使用存储库模式,因此这些产品来自何处并不重要: -

public interface IProductRepository
{
  IEnumberable<Product> GetProducts();
  ....
}
Run Code Online (Sandbox Code Playgroud)

我的存储库还描述了一个用户列表,以及他们管理的产品(用户和产品之间的许多产品).在应用程序的其他地方,Super-Admin正在对用户执行CRUD并管理用户与他们被允许管理的产品之间的关系.

任何人都可以查看任何产品,但只允许为特定产品指定为"管理员"的用户调用例如编辑操作.

应该如何在ASP.NET MVC中实现它?除非我错过了什么,否则我不能使用内置的ASP.NET Authorize属性,因为我需要为每个产品使用不同的角色,其次我不知道要检查哪个角色直到我从存储库中检索了我的产品.

显然,您可以将此场景概括为大多数内容管理方案 - 例如,用户只能编辑自己的论坛帖子.StackOverflow用户只能编辑他们自己的问题 - 除非他们有2000或更多代表...

作为一个例子,最简单的解决方案是:

public class ProductsController
{
  public ActionResult Edit(int id)
  {
    Product p = ProductRepository.GetProductById(id);
    User u = UserService.GetUser(); // Gets the currently logged in user
    if (ProductAdminService.UserIsAdminForProduct(u, p))
    {
      return View(p);
    }
    else
    {
      return RedirectToAction("AccessDenied");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 这些代码中的一部分需要重复 - 假设有几个操作(Update,Delete,SetStock,Order,CreateOffer),这取决于User-Products关系.你必须多次复制粘贴.
  • 它不是很可测试 - 你必须通过我的计数来模拟每个测试的四个对象.
  • 检查用户是否被允许执行操作似乎并不像控制器的"工作".我更倾向于更可插拔(例如通过属性的AOP)解决方案.但是,这是否意味着您必须两次选择产品(一次在AuthorizationFilter中,一次在Controller中)?
  • 如果不允许用户提出此请求,返回403会更好吗?如果是这样,我将如何做到这一点?

我可能会保持这个更新,因为我自己有想法,但我非常渴望听到你的想法!

提前致谢!

编辑

只是在这里添加一些细节.我遇到的问题是,我希望业务规则"只有具有权限的用户可以编辑产品"才能包含在一个且只有一个地方.我觉得确定用户是否可以对"编辑"操作进行GET或POST的相同代码也应该负责确定是否在"索引"或"详细信息"视图上呈现"编辑"链接.也许这不可能/不可行,但我觉得应该...... …

asp.net-mvc

41
推荐指数
2
解决办法
1万
查看次数

在ASP.NET MVC应用程序中实现粒度安全性(即授权)的最佳机制是什么?

假设一个高速开发人员的任务是构建一个可由许多不同的人访问的银行应用程序.每个人都希望访问他或她自己的帐户信息,但不希望其他人访问它.我想知道限制MVC应用程序访问的最佳实践,以便只有拥有该信息的用户(或管理员)才能访问它.

Authorize属性允许我们按角色进行限制.虽然这是一个起点,但似乎任何经过身份验证的用户都可以访问任何其他用户的信息.

ActionFilters似乎提供了更精细控制的选项,可能可用于完成任务.但是,我不清楚它们是否是推荐的方法.

欢迎任何指导或想法.

security asp.net-mvc authorization roles authorize

11
推荐指数
2
解决办法
4873
查看次数

标签 统计

asp.net-mvc ×2

authorization ×1

authorize ×1

roles ×1

security ×1