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