域模型中是否存在安全问题?

Cas*_*ins 6 .net security domain-driven-design mvvm

我正在开发一个基于MVVM的Winforms项目(.NET 4).为了安全起见,应用程序针对Active Directory进行身份验证,然后使用基于角色的安全性来确定对程序不同部分的访问权限.在大多数地方使用PrincipalPermissionAttribute实现安全性,如下所示:

<PrincipalPermissionAttribute(SecurityAction.Demand, Role:="Managers")> _
Public Sub Save() Implements IProductsViewModel.Save
    mUOW.Commit()
End Sub
Run Code Online (Sandbox Code Playgroud)

您可以从Interface实现中了解到,此特定Sub位于ViewModel中.PrincipalPermissionAttribute正在检查当前用户(Thread.CurrentPrincipal)是否处于Manager角色.

这引出了我的问题:是否应该在域模型中完成安全检查(如上所述)?

在我自己思考时,我有两个相互矛盾的观点:

1)保持域模型不受其他许多问题的影响,以降低复杂性和依赖性.(保持安全性,可能在ViewModel中实现).

2)域模型在某种程度上是"降压停在这里"的地方.如果我在域模型中实现安全性,那么我知道即使另一层中的安全性失败,域模型也应该捕获它.

那么,你说,域模型中的安全性与否?

Jos*_*ris 1

就我个人而言,我发现这个问题似乎属于服务层。据推测,应用程序将在某种程度上通过服务层持续存在,以便到达域,并且您可以轻松地使用非域服务来在提交之前验证用户的角色。

我以这种方式执行此操作的原因是基于这样的理论:越接近域的核心,调用堆栈就变得越昂贵。在更高级别上防止域的滥用/误用意味着更好的响应能力和凝聚力。

此外,假设需求发生变化,而另一个角色的某人现在可以执行相同的操作。在服务层中维护所有这些意味着您也不会更改应该不那么频繁地改动的代码。至少在我所做的事情中,积极的一点是,你越接近核心,代码改变的可能性就越小。这意味着你也减少了你的改变“涟漪”到你不想要的其他领域的变化。

出于更广泛的考虑,而不是针对个人,我不喜欢将任何类型的数据访问放入 ViewModel 中的想法。ViewModel 旨在作为特定于实现的模型的表示。理想情况下,这些物体应该尽可能轻。例如,如果对产品进行更改,则更改将通过服务,然后到达存储库,在存储库中可以将其注册到工作单元,等待提交。