保护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组成员资格来控制应用程序权限 – 您无需为此编写代码,并且在用户更改角色时,人们忘记删除应用程序权限的可能性降低