构建安全库,我认为我正在过度构建它 - c#

因此,我正在构建一个自定义的安全库,该库与我们的数据库连接。它应该为内部应用程序提供基本的访问控制:某些用户可以执行X,其他用户则不能。目前,我的需求非常基本,但是该库最终将由多个应用程序使用并控制许多安全性。

我的基本对象模型是用户是零个或多个组的成员。这些组授予零个或多个权限。实际上,所有这些都是一对多的,但是我不想引用地强制执行。权限是仅授予的权限(如果没有组授予您权限,则您没有权限,但是没有“ Deny”会像Windows RBS中那样覆盖授予的权限),并且组可以嵌套(第2层用户)拥有一级的权利,再加上一些新的权利。当尝试访问程序的安全区域时,应用程序将通过检查其组层次结构来强制性地断言用户具有必需的权限。

但是,我希望库中内置多个级别的冗余。尤其重要的是,没有权限更改安全设置的用户应该不能。因此,在大多数情况下,我希望将此安全性层次结构设为只读,因此无法在内存中添加所需但被拒绝的权限。仅当用户证明他们有权通过向只读用户提供该权限来修改安全设置时,才可以从代码级开始设置属性。

我认为那是我过度建造的地方。为了做到这一点,该领域发展出了分裂的人格。每个对象有两个副本,一个是只读的,另一个不是。只读版本是默认生成的版本。任何会产生可写版本的操作都需要当前登录的用户具有更改安全性的权限。这样就产生了两个用户(User和ConfigurableUser),两个组,两个权限,每个都有两个接口(从只读派生的可配置)...您就明白了。

我已经意识到,基本上所有这些多余的麻烦都会阻止的人是其他开发人员,这些开发人员通常是值得信赖的(这是一个内部应用程序,我们可以控制该应用程序使用的所有资源,并且开发人员通常会获得管理员权限很多)。如果我可以相信接触代码的人知道他们在做什么,那么这些应用程序可以被读写,并且可以通过一个聪明的代码片段“提升”权限不会有问题。

帮我这个理智的。我应该遵循其他模式吗?我有权不信任其他开发商吗?我不希望与Windows安全性集成,但是已经讨论了该选项。主要缺点是访问权限将在整个公司的Active Directory中维护,并且此应用程序用户的管理员不应具有对整体系统安全性的访问权限。

编辑:来自所有人的一些好的评论和答案。 AD或其他集成安全性并不是完全可行,但是我们在开始开发之前就进行了讨论,发现了一些缺点。因此,这是我/我们关于为什么甚至决定采用“自定义”安全设置的一些想法:

该应用程序的使用完全在内部。因此,此应用程序的安全性与其说是防止外部攻击/恶意收购,不如说是防止Joe Officeworker根据业务策略执行他不应该做的事情。如果Joe最终奇迹般地找到了一种使自己成为应用程序“神”的方法,那么他的能力仍然非常有限,因为该应用程序本身对数据库和其他资源的访问非常有限,而他需要做的大部分事情都是无论如何,因此即使是最低级别的用户也被授予。
尽管如此,如果用户曾经篡改,破解或键入过Windows密码,那么,如果该应用程序使用集成安全性而不是传统登录名,则攻击者将可以通过该应用程序以“免费”的方式对客户端数据进行一些严重访问。应用程序的单独安全层至少提供了冗余的可能性;他们必须破解两组凭据而不是一组凭据,而第二组凭据被锁定在另一层数据库安全性后面,而破解的用户将无法自由访问它们。
从开发/管理的角度来看,使用Active Directory或其他集成安全性存在两个问题。

首先,部门的成员“交换办公桌”,并在彼此的计算机上做很多事情。集成Windows安全性要求用户从操作系统中注销,以更改应用程序的当前登录用户,而不仅仅是以其他用户身份关闭,重新打开并登录该应用程序。
其次,将使用该软件的部门经理是处理应用程序内安全权限的逻辑人,但不是向其授予AD管理员访问权限的逻辑人。进行平衡需要在AD中增加角色层,以提供可以访问AD的“子管理员”,但只授予某些人某些权利。还有一个文件要求将安全管理集成到应用程序中,这使IMO使得AD集成变得不可行。
最后,据我所知,Windows集成安全性没有“权限”层。您可以断言用户处于特定角色中,而不是断言用户具有明确的操作权限,这是因为该角色具有继续执行的权限。因此,我可以开发一个系统,要求AD对应用程序中的每个特定安全性都具有角色,并嵌套到用户将要拥有的逻辑角色中(这是管理上的噩梦,我确信网络管理员会为避免其安全性而斗争。层),或者我们定义属于已知角色的广泛功能,将角色嵌套以创建“用户级别”,如果用户曾经需要从下一个级别访问某个功能,则他们必须获得整个级别(或必须更改AD AND我的应用程序以将该功能分成特定的可分配角色)。

考虑到所有这些,简单的解决方案是将安全性包含在应用程序的范围内,而不是依赖于网络安全性。我们获得了可以相对轻松维护的安全结构,该结构在应用程序处停止。

编辑2:作为对此问题的结尾,我最终得出的解决方案是保持可变的对象层次结构,然后创建一个简单的接口IAuthUser,其中具有用于用户基本信息和权限的只读成员。通过将使用凭据检索的用户复制到实现公共接口的私有类中,仅在一个位置(登录期间)创建IAuthUsers。通过查询启动时从用户的组成员资格投射的包含的权限列表,它们可用于所有身份验证和授权。他们永远不会变回可变的用户,因此永远也不会保存回数据库。同时,可变用户无法在登录过程之外转换为IAuthUser,因此对授权无用,并且如果不提供有权在对象中检测到更改类型的IAuthUser,则不能将其保存回DB。将其与数据库中当前的版本进行比较)

参考方案

我将拥有一个“用户可以修改安全设置”权限,并且断言用户每次尝试编辑内容时都可以拥有,而不是具有分层的结构。

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

.NET Core解决方案中同时具有API和MVC项目的约定 - c#

我有一个由以下项目构成的ASP.NET Core(.NET Core 2.2)应用程序:API:表示WebAPI(控制器继承ControllerBase)服务:包含API控制器用来访问数据库等的服务数据库:它包含常用的数据库存储库,服务层可利用这些数据库访问数据库现在,我想添加一个与API对话的UI(MVC部分位于.NET核心之前)。 .NET Core如何…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…