在Web应用程序中,我们定义角色,表单身份验证等以确保安全性,但是什么应该是保护Winform的最佳方法?
实际上我正在制作桌面应用程序,在成功登录后隐藏登录页面并显示DisplayForm
这样的内容;
//On successful login
this.Hide()
Form newForm = new DisplayForm();
newForm.Show();
但我不知道这是不是正确的方式?我希望用户只有在成功登录后才能看到此DisplayForm
。
请问任何指导?
答案 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成员资格授予或拒绝授予或拒绝应用程序权限,这些成员资格都可以通过查看用户原则来访问。
这样做的好处是: