我正在开发一个基于MVVM的Winforms项目(.NET 4)。为了安全起见,应用程序针对Active Directory进行身份验证,然后使用基于角色的安全性来确定对程序不同部分的访问权限。在大多数地方使用PrincipalPermissionAttribute实现安全性,如下所示:
<PrincipalPermissionAttribute(SecurityAction.Demand, Role:="Managers")> _
Public Sub Save() Implements IProductsViewModel.Save
mUOW.Commit()
End Sub
正如您可以从Interface实现中看到的那样,此特定Sub位于ViewModel中。 PrincipalPermissionAttribute正在检查当前用户(Thread.CurrentPrincipal)是否处于Manager角色。
这引出了我的问题:是否应该在域模型中完成安全检查(如上所述)?
在我自己思考时,我有两个相互矛盾的观点:
1)让域模型不必担心尽可能多的其他问题,以降低复杂性和依赖性。 (保持安全性,可能在ViewModel中实现)。
2)在某种程度上,域模型是“降压停在这里”的地方。如果我在域模型中实现安全性,那么我知道即使另一层中的安全性失败,域模型也应该捕获它。
那么,你们在域模型中的安全性是什么呢?
答案 0 :(得分:3)
有两种安全措施。
纯粹是技术性的 - 例如“所有流量应该通过https”或“只有特定服务应该触及数据库”或“只有特定流程应该能够触及文件系统/注册表”。
第二个与域绑定。像“只有角色秘书的用户可以访问付款历史记录”或“未授权用户不能访问会计资料”这样的东西。
第一个应该与域分离。第二个应该住在域内。
答案 1 :(得分:1)
就个人而言,我发现这种担忧似乎属于服务层。据推测,应用程序将通过服务层持续到某种程度以便到达域,并且您可以轻松地拥有非域服务来在提交之前验证用户的角色。
我这样做的原因是基于这样的理论:越接近域的核心,调用栈就越昂贵。防止在更高级别滥用/滥用域名意味着更好的响应能力和凝聚力。
此外,假设需求发生变化,而另一个角色中的某个人现在可以执行相同的操作。在服务层中维护所有这些意味着您也不会更改应该较少搅拌的代码。至少在我所做的事情上,从中获得的积极结果是,越接近核心,代码就越不可能改变。这意味着您还可以将更改的变化“减少”到您不想要的其他区域。
在一个更广泛的问题上,没有什么是个人的,我不喜欢在ViewModel中放置任何类型的数据访问的想法。 ViewModel旨在表示模型,特定于实现。理想情况下,这些对象应尽可能轻量级。例如,如果对产品进行了更改,则更改将通过服务进行,然后进入存储库,可以在工作单元中注册,等待提交。