【问题标题】:MVC3 Multi-User Data Level SecurityMVC3 多用户数据级安全性
【发布时间】:2012-01-18 22:50:30
【问题描述】:

我正在处理的应用程序是多用户和多公司的,我目前在试图找出确保数据级别安全性的最有效/最佳方法时遇到了麻烦,从广义上讲,阻止 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 功能的公共基类,因为它不会改变。

【问题讨论】:

    标签: asp.net-mvc-3 security multi-user


    【解决方案1】:

    似乎是两种常见的方法:OnActionExecuting 或 AuthorizeAttribute。看这里: How to Extend/Architect the ASP.NET MVC 3 Authorize Attribute to Handle This Scenario

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

    【讨论】:

    • Omri,我根据您发布的第一个链接中的链接更新了我的原始帖子以包含更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多