Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保护Winform页面的最佳方法?_C#_.net_Winforms_Security - Fatal编程技术网

C# 保护Winform页面的最佳方法?

C# 保护Winform页面的最佳方法?,c#,.net,winforms,security,C#,.net,Winforms,Security,在Web应用程序中,为了安全,我们定义了角色、表单身份验证等,但保护Winform的最佳方法是什么 实际上,我正在制作一个桌面应用程序,在成功登录后,我隐藏了登录页面,并像这样显示DisplayForm //On successful login this.Hide() Form newForm = new DisplayForm(); newForm.Show(); 但我不知道这是不是正确的方法?我希望用户只有在成功登录后才能看到此DisplayForm 有什么指导吗?请允许我在回答之前说一

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

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

//On successful login
this.Hide()
Form newForm = new DisplayForm();
newForm.Show();
但我不知道这是不是正确的方法?我希望用户只有在成功登录后才能看到此
DisplayForm


有什么指导吗?

请允许我在回答之前说一句话:WinForms应用程序中没有绝对的安全性。没有任何东西可以阻止用户反编译您的应用程序,删除您可能添加的任何登录要求并重新编译它

也就是说,我认为你的方法是正确的<代码>显示表单将不会显示,直到程序员明确告诉它这样做。因此,如果只在进行身份验证后调用
someInstanceOfDisplayForm.Show()
,就可以了

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

  • 在用户成功登录并
  • DisplayForm
    Form\u Open
    中(或您想要保护的任何其他表单)检查此值


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

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

通过这种方式,您始终可以通过检查当前用户主体(例如
Thread.CurrentPrinciple
)来做出授权决策。然后,应用程序权限的授予或拒绝可以基于其活动目录成员身份来完成,这些成员身份都可以通过查看用户原则来访问

这样做的好处是:

  • 它防止人们通过直接访问您的程序集而绕过您的安全性
  • 它允许管理员使用熟悉的Active Directory组成员身份来控制应用程序权限—您无需为此编写代码,并减少了用户更改角色时人们忘记删除应用程序权限的可能性

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

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

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

你就是不知道。您没有在Internet上与一个完全陌生的人交谈,您有一个已知的用户,他已经提供了登录Windows的凭据。这给了他分配的权利,包括但不限于扰乱你的程序和击败某种登录方案的权利。你可以在成功登录后使用委派。。。从新表单中解雇代表团安全不仅仅是隐藏或显示表单。你必须考虑你想要什么。例如,数据、函数或算法。客户机是否在受监管的环境中运行?@HansPassant这是我第二个担心的问题!如何分配权限,一种方法是使用web服务,因为应用程序中显示的数据来自远程桌面。。但问题是winForms不支持cookie等,因此对于每个事务,我都必须检查用户的凭据,但这是无效的,还有其他方法吗?@peer我想知道,如何确保只有在填写正确凭据后才能打开的页面“winForms应用程序中没有绝对安全性”。这适用于单机应用程序,但您可以保护应用程序使用的数据。例如,使用文件系统ACL、授权web服务或DB访问控制。当然,如果您使用windows auth而不是滚动自己的,这会容易得多。@heinzi,但有一个小问题。。当我隐藏某些内容时,它将被隐藏,如果用户关闭另一个显示的表单。。隐藏的窗体将不会关闭!另一种方式应该是什么?@hridya:我不确定我是否理解你的问题。也许你应该开始一个新的SO问题?@Heinzi是的,但现在我正在检查按钮点击时的用户凭据,并按语法将控件添加到同一表单中。。这不太费时,但我觉得这是最好的方法。。谢谢你的支持!我最近使用了
PrincipalPermissionAttribute
-有一个链接指向一个好的起点@bhs,我看到这个链接看起来很新很好。。你能用一些小例子解释一下你是如何实现的吗?@hridya我添加了一个新的答案,因为它更容易格式化代码。谢谢@bhs,我只想确认两件事。。我是否需要向app.config添加任何内容,以及如何在运行时定义角色,因为我的数据库值来自远程站点。我没有在app.config中执行任何操作,角色来自active directory。
        try
        {
            YourFunction();
        }
        catch (System.Security.SecurityException)
        {
            MessageBox.Show("You do not have permission to perform this action.", "Access Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
        ...