所以我正在构建一个自定义安全库,它与我们的数据库交互。它应该为内部应用程序提供基本的访问控制:某些用户可以做 X,其他人不能。我目前的需求非常基本,但该库最终将被多个应用程序使用并控制许多安全对象。
我的基本对象模型是用户是零个或多个组的成员。这些组授予零个或多个权限。实际上,这些都是一对多的,但我不想引用强制执行。权限仅授予(如果没有组授予您权限,则您没有权限,但没有像 Windows RBS 中那样覆盖授予的权限的“拒绝”),并且组可以嵌套(第 2 层用户拥有第 1 层的权利,以及一些新的权利)。当尝试访问程序的安全区域时,应用程序将通过检查其组层次结构来强制断言用户具有必要的权限。
但是,我希望在库中内置多个级别的冗余。特别重要的是,无权更改安全设置的用户不应该能够这样做。因此,我想在大多数情况下将此安全层次结构设为只读,因此无法在内存中添加所需但被拒绝的权限。只有当用户通过向只读用户提供该权限来证明他们有权修改安全设置时,这些属性才应该从代码级别变为可设置的。
这就是我认为我过度构建它的地方。为了做到这一点,该领域已经形成了 split 的人格;每个对象的两个副本,一个只读,另一个不是。只读版本是默认生成的版本;任何会产生可写版本的操作都需要当前登录的用户具有进行安全更改的权限。这导致了两个用户(User 和 ConfigurableUser)、两个组、两个权限,每个都有两个接口(interface)(从 readonly 派生的可配置)......你明白了。
我已经意识到,基本上唯一会阻止所有这些额外垃圾的人是其他开发人员,他们通常值得信赖(这是一个内部应用程序,我们控制该应用程序使用的所有资源,开发人员通常获得管理员权限)很多)。如果我相信接触代码的人知道他们在做什么,那么这些应用程序就可以读写,并且通过巧妙的代码片段“提升”权限的可能性就不会有问题。
帮我搞清楚。我应该遵循不同的模式吗?我不信任其他开发人员是否正确?我不想与 Windows 安全集成,但已经讨论了该选项;主要缺点是整个公司的访问权限将在 Active Directory 中维护,并且此应用程序的用户的经理不应该对整个系统安全具有这种访问权限。
编辑:来自所有人的一些好的评论和答案。 AD 或其他集成安全性并非完全不可行,但我们在开始开发之前确实讨论过它,并发现了一些缺点。所以,这里有更多我/我们关于为什么我们甚至决定采用“自定义”安全设置的想法:
鉴于所有这些,简单的解决方案是将安全性包含在应用程序的范围内,而不是与网络安全性相关联。我们得到了一个可以相对轻松地维护的安全结构,它停留在应用程序上。
编辑 2:作为这个问题的结尾,我最终得到的解决方案是保持我的可变对象层次结构,然后创建一个简单的接口(interface) IAuthUser,其中包含用户基本信息和权限的只读成员。 IAuthUsers 仅在一个地方创建 - 在登录期间 - 通过将使用凭据检索到的用户复制到实现公共(public)接口(interface)的私有(private)类中。它们用于所有身份验证和授权,方法是在启动时询问从用户组成员身份转换的包含的权限列表。它们永远不会变回可变用户,因此永远不会保存回数据库。同时,可变用户不能在登录过程之外变成 IAuthUsers,因此对授权无用,并且如果不提供有权在对象中检测到更改类型的 IAuthUser(通过将其与数据库中当前的版本进行比较)
最佳答案
我没有拆分层次结构,而是拥有“用户可以修改安全设置”权限,并在用户尝试编辑某些内容时断言。
关于c# - 建立一个安全库,我想我过度 build 了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036661/