假设一个高速开发者的任务是建立一个由许多不同的人访问的银行业务应用程序.每个人都想要访问他或她自己的帐户信息,但不希望其他人访问它.我想知道在MVC应用程序中限制访问的最佳做法,以便只有拥有信息的用户(或管理员)可以访问它.
授权属性允许我们通过角色来限制.虽然这是一个起点,但似乎任何经过身份验证的用户都可以访问任何其他用户的信息.
ActionFilters似乎提供了一个更精细的控制选项,可能用于完成任务.不过,我不清楚是否是推荐的做法.
欢迎任何指导或想法.
解决方法
ActionFilter可能是一个很好的起点,但根据您的架构,您可能需要考虑外围防御是否足够好.
如果您基本上构建单层ASP.NET MVC应用程序(并且可能有完全合理的原因可以这样做),那么ActionFilter将提供足够的防御,同时非常简单的应用.
另一方面,如果您的应用程序是多层应用程序,则深度防御更合适.在这种情况下,您应该考虑在域模型中应用授权逻辑,或者甚至在数据访问层中应用授权逻辑.这将确保如果您开发了基于相同域模型(例如Web服务)的其他应用程序,则授权逻辑仍然适用.
无论你做什么,我强烈建议您将实际的授权实施基于IPrincipal.
在一个更具体的注意事项上,您在这里询问的是最好的基于ACL的授权建模:在每个用户配置文件上设置ACL,默认情况下只允许访问用户他/她自己和管理员.如果/当您稍后需要扩展应用程序以允许委派访问其他用户的配置文件(我不知道在特定情况下是否远程实现),您可以通过向ACL添加新条目来简单地执行此操作.
在这种情况下,评估访问涉及检索所请求资源的ACL,并检查当前用户(IPrincipal)是否包含在该ACL中.这样的操作很可能涉及到进程外操作(在数据库中查找ACL),因此将其隐藏在ActionFilter后面作为应用程序的隐含部分,听起来可能会隐藏一些性能问题.在这种情况下,我会考虑使授权模型更具说明力/可见性.