我正在ASP.NET MVC3中开发一个使用CQRS模式的应用程序。命令端由Entity Framework构成,实体映射到SQL Server中的表。查询端构建在SQL视图之上(也使用EF)。
我应该如何管理数据访问?例如,有一个文件。文档可以使用密码进行保护,任何知道该文档的人都可以访问该文档,或者只有给定的登录用户才能访问该文档。
应该在何处以及如何实施允许/拒绝访问的逻辑? DocumentViewModel中应包含哪些数据?它是否应该包含一个密码字段来将其与用户提供的密码进行比较,这样我就可以检查访问并获取数据以便在单个查询中显示?或者它应该只包含将在UI中显示的字段,因此单独的查询(或存储过程调用?)将负责检查访问?
如果访问规则比仅检查密码更复杂 - 可能包括所有白名单,黑名单,付款,转帐限额,帐户类型等等,该怎么办? 总的来说 - 事情远非
SELECT * FROM ReadModelTable WHERE id = @id
通常在“良好”阅读场景的示例中显示。
答案 0 :(得分:1)
Episode 28 of Being the Worst (Podcast)对使用CQRS的系统的授权和身份验证有一些有趣的观点。我经常在听取其他人的意见后考虑认证,并将理论系统架构作为核心领域之外的关注点。另一方面,授权可以在核心领域内具有元素,但在许多系统中似乎也是一些交叉问题。
在您的示例中,如果处理某些类型的文档聚合,其中每个都需要具有单独的用户名和密码,那么您的提议将起作用,但它听起来不像是典型的实现。主要的失败点是凭证与文档一起存在,并且可能在用户之间共享,这是一个安全问题,并且在将来有问题时撤销单个用户的访问权限。想象一个秘密俱乐部,每个成员都需要知道秘密密码。如果密码永远不会改变,那么当有人被踢出俱乐部或意外地与非预期的一方分享密码时,你会遇到问题。