安全的基于角色的 Windows 窗体






3.18/5 (8投票s)
本文介绍了如何实现基于角色的 Windows 窗体安全性。该解决方案包括一个“SecureBaseForm”,它允许/拒绝访问继承的窗体,并且可以触发 UserIsAllowed 或 UserIsDenied 事件。
引言
这个基于角色的安全基窗体允许您在 Windows 窗体上实现安全性,而无需为应用程序或项目中的每个窗体重写基本的安全性处理。
背景
由于我需要限制对几个窗体或窗体的几个部分的访问,我一直在寻找一个可以提供此功能的基窗体。但是,我遇到的那些功能有限,因此我不得不寻找其他方法来实现此目标。首先,我设置了此基窗体所需的基本要求
- 基窗体在设计模式下使用时不应冲突(尽管是基本的,但需要考虑一些问题)。
- 基窗体应将窗体的所需角色和用户主体 (
IPrincipal
) 作为参数,以便验证对窗体的访问权限。 - 基窗体应
- 当其中一个用户角色在窗体角色中时打开窗体。
- 当没有任何用户角色在窗体角色中时,不要打开窗体。
- 允许在允许用户时引发事件。
- 允许在拒绝用户时引发事件(在这种情况下,窗体需要打开,这会取代第二个选项)。
- 提供用户角色和窗体角色中包含的已验证的角色列表。
在寻找正确的方法时
在互联网上搜索的过程中,我发现了这篇文章:简化实现 (无标题),它构成了此实现的基本思想。但是,尽管简化了,这个人正确地描述了要采取的方法,因此我有兴趣使用相同的骨架。在测试这种方法时,我遇到了一个问题:当窗体从 `Main` 方法 (program.cs) 初始化时,不调用 "Show
" 或 "ShowDialog
" 方法,并且需要另一种初始化方式。幸运的是,我发现了这篇文章解释了如何处理这个问题:Windows 窗体 2.0 中的应用程序架构。我在此方法中遇到的一个缺陷是,当主窗口从未可见时,它会在后台默默地运行,但这是一个开始。
[STAThread]
static void Main()
{
...
// Create and show the main form modelessly
MainForm form = new MainForm();
form.Show();
// Run the application only when the Form has been created.
if( form.Created )
Application.Run();
}
使用代码
基于 `SecureBaseForm` 创建窗体并实现安全参数
public class Form1 : SecureBaseForm
{
public void Form1(IPrincipal userPrincipal) :
base( new string[] { "UserRole1", "UserRole2" }, userPrincipal )
{
//
// Capture the principal here in case it is needed in a second Form
//
InitializeComponents();
}
}
在上面的示例中,当用户主体中包含 "UserRole1
" 或 "UserRole2
" 角色时,将允许窗体用户。通过此示例,我们还可以展示当用户有权访问窗体,但您希望根据其中一个角色禁用某些功能时的实现
//
// Form1 has the event handling "Form1_UserIsAllowed" defined
//
private void Form1_UserIsAllowed(object sender, EventArgs e)
{
button1.Enabled = this.ValidatedUserRoles.Contains("UserRole1");
button2.Enabled = this.ValidatedUserRoles.Contains("UserRole3");
}
无论用户是否定义了 "UserRole1
" 或 "UserRole2
" 角色,都会启用适当的按钮。为 "UserIsDenied
" 嵌入相同的事件处理。
关注点
我从未如此高兴地实施安全性,因为总会有弱点,您必须关注各种论坛等以保持最新。尽管如此,我认为这是一个不错的方法,这将使我未来的应用程序少一个障碍。
如果您想评论,请这样做...
历史
- 版本 1.00 (2009 年 9 月 30 日) - 希望,也可以对 UserControls 做些什么(请睁大眼睛)。