1

我们正在考虑将 ASP.NET MVC 的 Hot Towel SPA 模板作为一个新项目,但不确定如何过滤和保护用户特定数据。我们的项目将是基于 EntityFramework 的 ASP.NET MVC。

考虑一种允许人们存储不同公司的销售信息的服务,每个公司都有一个或多个位置。

  • 当商店经理登录时,他应该只看到他商店的销售额。
  • 当区域经理登录时,他应该只能看到他所在区域的商店。
  • 当 CEO 登录时,他应该可以看到所有的商店。

这个业务逻辑可以在客户端的 Javascript 中处理,但似乎很容易用浏览器开发工具、Fiddler 等绕过。通过操作 HTTP 请求字符串(因为它是基于 OData 的),他们可以看到公司中其他商店的数据,并可能看到其他公司的商店。

最好在客户端说:

var query1a = EntityQuery.from("Customers") .where("CompanyName", "startsWith", "A");

它只为当前用户返回结果,而不是为整个数据库返回结果。

有关如何在服务器上完成此操作的任何建议/示例/教程?

将此“过滤器”逻辑存储在会话变量中是否有意义?所以对于上面的查询:

(大意的东西)

[HttpGet] public IQueryable<Customer> Customers() { return _contextProvider.Context.Customers.Where(x=> x.CompanyID == Session['CompanyID']; }

4

1 回答 1

1

您可以通过编写服务器端查询方法来完全按照您的要求进行操作,以便它们添加限制 where 子句以实现您需要的基于用户的过滤效果。

您还想对保存施加相同的限制。你不能相信客户。例如,您不希望商店经理能够保存不同商店的销售额。

可能涉及很多业务逻辑。我不会把它放在 Web API 控制器中。我喜欢我的控制器专注于 Web 请求和服务器端业务逻辑之间的中介。我喜欢封装在其他一些类中的逻辑。

这些安全措施首先假设您有适当的身份验证/授权方案,并且用户......及其权限......在处理请求时是已知的。您应该能够传递该安全信息。

在查询方面,您可以拥有一个或多个存储库来设置查询的最小过滤器。在为您的问题编写的查询中,您有正确的想法。细节是业务特定的。我只是将它移出控制器并进入一个或多个支持存储库类。

当用户保存时,您会执行类似的操作。在您的 BeforeSaveEntities 方法中,您将检查每个要保存的实体,并确保用户有权进行该更改。

这不是微不足道的逻辑。当您弄清楚时,Breeze 挂钩可以应用该业务逻辑。

于 2013-11-01T07:33:07.667 回答