使用Windows原则/角色以编程方式控制对控件/窗体的访问-C#

使用Windows原则/角色以编程方式控制对控件/窗体的访问-C#,c#,winforms,security,roles,C#,Winforms,Security,Roles,所讨论的应用程序相当广泛,有许多不同类型的访问角色(如客户服务、人力资源、管理员等)。分层访问,因此每个角色都继承其下的访问权限,因此HR具有只读,CS具有编辑功能,管理员具有完全控制权。菜单栏和按钮启用/可见属性由外部库控制,该库通过反射处理所有基于角色的访问。写这篇文章的人是个邪恶的天才 话虽如此,我最终还是想把它移除。关于它如何工作的知识基础在几年前就留给了他,而这个应用程序的开发也开始停滞不前,因为关于安全“套件”的文档非常糟糕。所有内容都存储在数据库中,直至每个标签的标签可见性。这有点

所讨论的应用程序相当广泛,有许多不同类型的访问角色(如客户服务、人力资源、管理员等)。分层访问,因此每个角色都继承其下的访问权限,因此HR具有只读,CS具有编辑功能,管理员具有完全控制权。菜单栏和按钮启用/可见属性由外部库控制,该库通过反射处理所有基于角色的访问。写这篇文章的人是个邪恶的天才

话虽如此,我最终还是想把它移除。关于它如何工作的知识基础在几年前就留给了他,而这个应用程序的开发也开始停滞不前,因为关于安全“套件”的文档非常糟糕。所有内容都存储在数据库中,直至每个标签的标签可见性。这有点过火,不利于重构

我花了大量时间研究windows窗体的安全性。我们正在为此应用程序运行自己的用户/角色,而不是Active Directory。我想使用User/Principal,因为这看起来是最好的选择。如果还有其他选择,我愿意接受建议,我希望看到这是正确的方式,因为我们正在考虑完全重写(与此无关)

我通过MSDN和其他网站进行的所有搜索让我相信,我只能根据角色控制方法和类的流程,而不像“启用此按钮”或“隐藏此菜单栏”那样精细

有没有比按照以下思路做事更好的方法

btnA.Visible = Thread.CurrentPrincipal.IsInRole("HR");  
btnA.Enabled = Thread.CurrentPrincipal.IsInRole("CS") ||  
    Thread.CurrentPrincipal.IsInRole("ADMIN");

总的来说,有更好的方法吗?处理此问题的最佳方式是什么?

这与我们在WinForms和ASP.net应用程序中的处理方式非常接近。一个区别是,我们将角色名存储在数据库中,这样它们比硬编码常量更易于维护和升级


虽然它缺乏某种自动装订的性感(这似乎是你正在寻找的),但它是坚固的,处理起来并不麻烦。然而,我们的应用程序在用户之间并没有很大的差异。在大多数情况下,如果用户能够访问应用程序的一部分,他们就可以执行大部分操作。

这与我们在WinForms和ASP.net应用程序中的操作方式非常接近。一个区别是,我们将角色名存储在数据库中,这样它们比硬编码常量更易于维护和升级


虽然它缺乏某种自动装订的性感(这似乎是你正在寻找的),但它是坚固的,处理起来并不麻烦。然而,我们的应用程序在用户之间并没有很大的差异。在大多数情况下,如果用户能够访问应用程序的一部分,他们就可以执行大部分操作。

我理解将角色名称存储在数据库中,但是如果不使用硬编码常量,您将如何使用它们?我现在想象的唯一方法是将常量存储在静态角色类中,这就是你的意思吗?非常感谢!它可能不性感,但它会工作,这是我不能说的东西与我们目前的实施太久!我理解在数据库中存储角色名,但如果不使用硬编码常量,您将如何使用它们?我现在想象的唯一方法是将常量存储在静态角色类中,这就是你的意思吗?非常感谢!它可能不性感,但它会工作,这是我不能说的东西与我们目前的实施太久!