在 Web 应用程序中,我们为安全定义角色、表单身份验证等,但是保护 Winform 的最佳方法应该是什么?
实际上我正在制作桌面应用程序,在成功登录后隐藏登录页面并显示DisplayForm
如下;
//On successful login
this.Hide()
Form newForm = new DisplayForm();
newForm.Show();
但是不知道这样对不对?DisplayForm
我希望用户只有在成功登录后才能看到这一点。
请问有什么指导吗?
按照迈克的回答,这是我使用的实现(按照 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);
}
...
让我以以下一般性评论作为我的回答的开头:WinForms 应用程序中没有绝对的安全性。没有什么能阻止用户反编译您的应用程序,删除您可能添加的任何登录要求并重新编译它。
也就是说,我认为你的方法是正确的。DisplayForm
直到你,程序员,明确告诉它这样做,才会显示。因此,如果您只someInstanceOfDisplayForm.Show()
在身份验证发生后调用,那很好。
作为一种额外的安全措施(防止一些编程错误),一种常见的做法是
UserLoggedIn
在用户成功登录后设置一些全局变量¹Form_Open
的此值。DisplayForm
¹ ...或 Singleton 属性或其他某种全局存储。是的,全局变量是邪恶的,但我认为在这种情况下这是合理的,因为登录到应用程序的用户是合法“全局状态”的主要示例。如果需要,我很乐意在评论中进一步讨论。
我认为最好的方法是使用 Windows 身份验证(正如 Hans Passant 的评论中所建议的那样),并且不要实现自己的登录对话框和用户存储。
这样,您始终可以通过检查当前用户主体(例如Thread.CurrentPrinciple
)来做出授权决定。然后可以根据它们的 Active Direcory 成员资格授予或拒绝应用程序权限,这些都可以通过查看用户原则来访问。
这样做的好处是: