3

我正在使用 CQRS 模式的 ASP.NET MVC3 中开发一个应用程序。命令端是使用实体框架制作的,实体映射到 SQL Server 中的表。查询端建立在 SQL 视图之上(也使用 EF)。

我应该如何管理对数据的访问?例如有一个文档。文档可以用密码保护,任何知道它的人都可以访问,或者只能由给定的登录用户访问。

应该在哪里以及如何实现允许/拒绝访问的逻辑?DocumentViewModel 中应该包含哪些数据?它是否应该包含一个密码字段以将其与用户提供的密码进行比较,以便我可以检查访问并获取数据以在单个查询中显示?或者它应该只包含将在 UI 中显示的字段,因此一个单独的查询(或存储过程调用?)将负责检查访问?

如果访问规则比仅检查密码更复杂——可能包括所有白名单、黑名单、付款、转账限制、账户类型等,该怎么办?一般来说 - 事情很远

SELECT * FROM ReadModelTable WHERE id = @id

这通常显示在“好”阅读场景的示例中。

4

1 回答 1

1

《Being the Worst》(播客)的第 28 集关于使用 CQRS 的系统的授权和身份验证有一些有趣的观点。在听取其他人的意见并提出理论系统架构之后,我经常将身份验证视为核心领域之外的一个问题。另一方面,授权可能包含核心域中的元素,但在许多系统中似乎也存在一些交叉问题。

在您的示例中,如果处理某种类型的文档聚合,其中每个都需要有一个单独的用户名和密码,那么您的建议将起作用,但听起来不像典型的实现。主要的失败点是凭证与文档一起存在,并且可能在用户之间共享,这是一个安全问题,并且使得将来撤销单个用户的访问权限成为问题。像一个秘密俱乐部一样思考,每个成员都需要知道秘密密码。如果密码永远不会更改,那么当有人被踢出俱乐部或不小心与意外的一方共享密码时,您就会遇到问题。

于 2015-01-27T06:44:16.943 回答