3

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

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

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

但是不知道这样对不对?DisplayForm我希望用户只有在成功登录后才能看到这一点。

请问有什么指导吗?

4

3 回答 3

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);
        }
        ...
于 2013-09-12T08:57:33.963 回答
2

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

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

作为一种额外的安全措施(防止一些编程错误),一种常见的做法是

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

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

于 2013-09-11T11:19:30.917 回答
2

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

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

这样做的好处是:

  • 它可以防止人们通过直接访问您的程序集来绕过您的安全性
  • 它允许您的管理员使用熟悉的 Active Directory 组成员身份控制应用程序权限 - 您无需为此编写代码,并减少人们在用户更改角色时忘记删除应用程序权限的机会
于 2013-09-11T11:48:37.517 回答