65.9K
CodeProject 正在变化。 阅读更多。
Home

安全的基于角色的 Windows 窗体

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.18/5 (8投票s)

2009年9月30日

CPOL

3分钟阅读

viewsIcon

67494

downloadIcon

5574

本文介绍了如何实现基于角色的 Windows 窗体安全性。该解决方案包括一个“SecureBaseForm”,它允许/拒绝访问继承的窗体,并且可以触发 UserIsAllowed 或 UserIsDenied 事件。

SecureBaseForm.jpg

引言

这个基于角色的安全基窗体允许您在 Windows 窗体上实现安全性,而无需为应用程序或项目中的每个窗体重写基本的安全性处理。

背景

由于我需要限制对几个窗体或窗体的几个部分的访问,我一直在寻找一个可以提供此功能的基窗体。但是,我遇到的那些功能有限,因此我不得不寻找其他方法来实现此目标。首先,我设置了此基窗体所需的基本要求

  1. 基窗体在设计模式下使用时不应冲突(尽管是基本的,但需要考虑一些问题)。
  2. 基窗体应将窗体的所需角色和用户主体 (IPrincipal) 作为参数,以便验证对窗体的访问权限。
  3. 基窗体应
    1. 当其中一个用户角色在窗体角色中时打开窗体。
    2. 当没有任何用户角色在窗体角色中时,不要打开窗体。
    3. 允许在允许用户时引发事件。
    4. 允许在拒绝用户时引发事件(在这种情况下,窗体需要打开,这会取代第二个选项)。
  4. 提供用户角色和窗体角色中包含的已验证的角色列表。

在寻找正确的方法时

在互联网上搜索的过程中,我发现了这篇文章:简化实现 (无标题),它构成了此实现的基本思想。但是,尽管简化了,这个人正确地描述了要采取的方法,因此我有兴趣使用相同的骨架。在测试这种方法时,我遇到了一个问题:当窗体从 `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 做些什么(请睁大眼睛)。
© . All rights reserved.