所讨论的应用程序相当广泛,具有许多不同类型的访问角色(阅读客户服务、人力资源、管理员等)。分层访问,因此每个角色都继承其下面的访问权限,因此 HR 具有只读权限,CS 具有编辑权限,Admins 具有完全控制权。菜单栏和按钮启用/可见属性由外部库控制,该外部库通过反射处理所有基于角色的访问。写这篇文章的人是个邪恶的天才。
话虽如此,我最终还是想将其删除。多年前,关于它如何工作的知识库就留给了他,并且由于安全“套件”上的文档很糟糕,此应用程序的开发开始停滞不前。一切都存储在数据库中,包括每个标签的标签可见性。这有点过分而且不利于重构。
我花了很多时间研究 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 应用程序中的做法非常接近。一个区别是我们将角色名称存储在数据库中,这样它们比硬编码常量更容易维护和升级。
虽然它缺乏某种自动绑定(bind)(您似乎正在寻找)的性感,但它很坚固并且处理起来并不麻烦。然而,我们的应用程序在用户之间并没有很大的差异。在大多数情况下,如果用户可以访问应用程序的一部分,他们就可以执行大部分操作。
关于c# - 使用 Windows 原则/角色以编程方式控制对控件/窗体的访问 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066954/