保护Winform页面的最佳方法是什么?

时间:2013-09-11 10:56:14

标签: c# .net winforms security

在Web应用程序中,我们定义角色,表单身份验证等以确保安全性,但是什么应该是保护Winform的最佳方法?

实际上我正在制作桌面应用程序,在成功登录后隐藏登录页面并显示DisplayForm这样的内容;

//On successful login
this.Hide()
Form newForm = new DisplayForm();
newForm.Show();

但我不知道这是不是正确的方式?我希望用户只有在成功登录后才能看到此DisplayForm

请问任何指导?

3 个答案:

答案 0 :(得分:3)

接下来迈克回答这是我使用的实现(根据OP的要求):

将以下内容添加到函数定义中:

[PrincipalPermissionAttribute(SecurityAction.Demand, Role = "<Your role>")]
public void YourFunction()
{
    .. do something
}

<Your Role>是您要限制访问的AD角色。

然后像这样包装你的函数调用:

        try
        {
            YourFunction();
        }
        catch (System.Security.SecurityException)
        {
            MessageBox.Show("You do not have permission to perform this action.", "Access Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
        ...

答案 1 :(得分:2)

让我用以下一般性评论来说明我的答案: WinForms应用程序中没有绝对的安全性。没有什么能阻止用户反编译您的应用程序,删除您可能添加的任何登录要求并重新编译它

那就是说,我认为你的方法是正确的。只有程序员明确告诉你这样做,才会显示DisplayForm。因此,如果您只在身份验证发生后调用someInstanceOfDisplayForm.Show(),那就没问题了。

作为一项额外的安全措施(为了防范某些编程错误),通常的做法是

  • 在用户成功登录后设置一些全局变量¹UserLoggedIn
  • Form_Open DisplayForm(或您要保护的任何其他表单)中检查此值。

¹...或Singleton属性或某种其他类型的全局存储。是的,全局变量是邪恶的,但我认为在这种情况下它是合理的,因为登录应用程序的用户是合法“全局状态”的主要示例。如果需要,我很乐意在评论中进一步讨论。

答案 2 :(得分:2)

我认为最好的方法是使用Windows身份验证(如Hans Passant的评论中所述),并且不要实现自己的登录对话框和用户存储。

通过这种方式,您始终可以通过检查当前用户主体(例如Thread.CurrentPrinciple)来做出授权决策。然后,可以根据其Active Direcory成员资格授予或拒绝授予或拒绝应用程序权限,这些成员资格都可以通过查看用户原则来访问。

这样做的好处是:

  • 它可以通过直接转到您的程序集来阻止人们绕过您的安全性
  • 它允许您的管理员使用熟悉的Active Directory组成员资格来控制应用程序权限 - 您无需为此编写代码,并且当用户更改角色时,人们忘记删除应用程序权限的可能性降低