2

我正在处理的应用程序是多用户和多公司的,目前我在试图找出确保数据级别安全性的最有效/最佳方法时遇到了麻烦,从广义上讲,阻止 UserA 看到 UserB 的数据。如果有各种控制器(产品、订单等)和模型,则路由类似于 Product/Edit/1 和 Order/Edit/1。但是,为了确保用户无法更改路由以查看彼此的数据,似乎每个服务层/数据库层调用都需要我检查特定的产品密钥/订单密钥是否属于经过身份验证的用户?这是最好的选择还是我错过了更优雅的东西。

编辑更新

从下面 Omri 的回答来看,第一个链接实际上有一个指向here的链接。它提到了实现访问级别安全性的各种方法,但我想这就是我想了解人们的意见。我应该做这样的事情:

public class ProductController
{
    public ActionResult Edit(int id)
    {
        if (_productService.CanUserEdit(id, userID))
        {
            _productService.Save(id);
        }
        else
        {
            throw UnauthorizedException;
        }

        return RedirectToAction("Index");
    }
}

或者

public class ProductController
{
    public ActionResult Edit(int id)
    {
        _productService.Save(id, userID);

        return RedirectToAction("Index");
    }
}

public class ProductService
{
    public void Save(int id, int userID)
    {
        if (CanUserEdit(id, userID))
        {
            //DO SAVE
        }
    }

    private CanUserEdit(int id, int userID)
    {
    }
}

显然,这两种实现之间没有太大区别,只是动作是发生在控制器内还是发生在服务级别。服务级别会根据公司动态变化,所以我的猜测是我们可能应该做第一个选项,并让每个公司的产品服务派生自一个实现 CanUserEdit 功能的公共基类,因为它不会改变。

4

1 回答 1

1

似乎是两种常见的方法:OnActionExecuting 或 AuthorizeAttribute。请参阅此处: 如何扩展/架构 ASP.NET MVC 3 授权属性以处理此场景

ASP.NET MVC 3 还具有全局操作过滤器,它允许您在不需要显式属性声明的情况下全局应用操作过滤器:http: //blog.tallan.com/2011/02/04/global-action-filters-in- asp-net-mvc-3/

于 2012-01-18T05:06:25.193 回答