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

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

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

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

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

有什么指导吗?

接下来从Mike的回答来看,这是我使用的实现(根据OP的要求):

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

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

其中是您要限制访问的AD角色。

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

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

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

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

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

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

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

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

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

这样做的好处是:

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