我正在开发的应用程序是多用户和多公司,我目前正在努力找出确保数据级安全性的最有效/最佳方法,从广义上来说,阻止UserA查看UserB的数据。如果有各种控制器(产品,订单等)和型号,那么路线就像Product / Edit / 1和Order / Edit / 1。但是,为了确保用户无法更改路由以查看彼此的数据,似乎每个服务层/ db层调用都要求我检查特定的产品密钥/订单密钥是否属于经过身份验证的用户?这是最好的选择,还是我错过了更优雅的东西。
修改更新
根据Omri的回答,第一个链接实际上有here的链接。它提到了实现访问级别安全性的各种方法,但我想这就是我想知道人们的意见。我应该这样做:
public class ProductController
{
public ActionResult Edit(int id)
{
if (_productService.CanUserEdit(id, userID))
{
_productService.Save(id);
}
else
{
throw UnauthorizedException;
}
return RedirectToAction("Index");
}
}
OR
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)
{
}
}
显然,两种实现之间没有太大区别,只是操作是在Controller内还是在服务级别进行。服务级别会根据公司的不同而变化,所以我的猜测是我们可能应该做第一个选项并让每个公司的产品服务都来自实现CanUserEdit功能的公共基类,因为它不会改变。 / p>
答案 0 :(得分: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/