如何在Windows窗体中实现安全组件?

时间:2009-04-24 05:13:25

标签: winforms security user-management

从ASP.NET进入WindowsForms应用程序开发我希望看到类似的控件可以使用。令我惊讶的是,我没有看到任何安全控制(登录,用户管理等)

我是否遗漏了某些内容,或者我必须为应用程序实施自己的安全性(基于角色的安全性,用户管理等)?

该应用程序供内部使用(10-20个用户),但由于敏感数据,安全性非常重要。 (MSSQL Server 2005位于后端,.NET 3.5)

任何信息都将不胜感激。

编辑:

我想我的问题是“在WinForms中是否有类似ASP.NET的成员资格提供程序?”

EDIT2:

在我发现this article一些谷歌搜索之后,我会试一试,其他任何建议都表示赞赏。

6 个答案:

答案 0 :(得分:3)

由于你没有接受答案,因为我偶然发现了研究另一个问题,我会尽力给你一些指示。

正如已经指出的那样,win form app中的用户管理和基于角色的安全性并不是客户端实际工作的东西。在网络类比中,想象一下只使用javascript和cookie来实现所有安全性,在服务器端不保留任何信息。它默认是不安全的。

正如我们所建议的那样,您可以在数据库上实现安全性,并让您的用户从您的win表单直接连接到数据库。我强烈建议你不要追求这样的课程。用户管理将成为一场噩梦。您需要中间层。

您应该做的是构建一个实现基于角色的安全性的Web服务(因为您熟悉它 - 有更好的授权选项)并且具有自定义身份验证存储。如果使用WCF构建Web服务,则可以使用与ASP.NET中相同的RoleProvider和MembershipProvider类。

该Web服务处理系统的所有业务逻辑,并负责连接到数据库。它提供了一个安全的抽象层,并减少了为管理用户而需要执行的数据库管理。您的win表单应用程序将成为UI shell,仅负责处理用户交互和前期数据验证(您还应该在中间层验证)而不是其他任何内容。

答案 1 :(得分:2)

Microsoft发布了客户端应用程序服务,以完全按照我的想法...

http://msdn.microsoft.com/en-us/library/bb384297.aspx是官方文件 http://aspalliance.com/1595_Client_Application_Services__Part_1是一个很好的教程(有截图等)

答案 2 :(得分:2)

大多数情况下,Windows窗体应用程序用于具有Windows域帐户的内部网络 在这种情况下,您应该使用“集成安全性”连接到数据库并测试用户是否通过

进行身份验证
 WindowsIdentity winIdentCurrent = WindowsIdentity.GetCurrent();
 if (winIdentCurrent != null)
 {
      Console.Write("WindowsIdentity.GetCurrent(): ");
      Console.WriteLine(winIdentCurrent.Name);
      Console.Write("WindowsIdentity.GetCurrent() IsAuthenticated: ");
      Console.WriteLine(winIdentCurrent.IsAuthenticated);
      // Everything is fine, trust Windows API :-)
 }

否则
通过您自己的方法(db调用)验证用户/传递

  1. 使用通用连接字符串
    (不推荐)
  2. 将连接字符串的用户/传递设置为您的 经过身份验证的用户/传递
  3. 将Thread.CurrentPrincipal设置为您自己的Principal对象

答案 3 :(得分:1)

我一直在找同样的东西,直到现在才找到任何东西。看看这个:

这里不多: WinForms中的NET提供程序 http://windark.net/blog/PermaLink,guid,5341a7d0-4eab-473d-9143-a3fa6c41db90.aspx

解决方案就在这里。一个很好的样本(在VB中): 在Windows窗体应用程序中使用ASP.NET成员资格提供程序 http://www.theproblemsolver.nl/usingthemembershipproviderinwinforms.htm

但后来我想,是否还有人为Winforms编写了等效的aspnet控件? MSDN Mag文章的开头就在这里: 统一Windows窗体和ASP.NET提供程序以进行凭据管理 http://msdn.microsoft.com/en-us/magazine/cc163807.aspx

我希望这能回答你的问题;)

答案 4 :(得分:0)

如果您直接连接到数据库(没有中间层),则需要在数据库级别应用安全性。

如果您有关于是否计划从客户端计算机或通过Web服务等直接连接到数据库的更多信息,我可以更新我的答案以反映这一点。

当直接连接到数据库时,您需要确保数据库不仅对您的应用程序是安全的,而且对任何可以连接到SQL Server的人都是安全的。您可以使用Windows身份验证连接到SQL Server并基于此设置角色。

答案 5 :(得分:0)

对于登录表单,我使用自己的组件作为对CredentialsUIPromptForCredentials(credui.dll)的p / invoke调用的包装器,有关详细信息,请参阅this MSDN article。它提供了安全记住用户密码的功能。

令人惊讶的是,框架中没有这个功能。可能是因为credui.dll仅在XP及更高版本上可用,在这种情况下,我们可能会在未来版本的框架中看到它。

至于基于角色的安全性,它在客户端应用程序中本质上是不安全的,因为智能用户可以使用反汇编程序访问您的源代码。

因此,虽然您可以在WinForms应用程序中使用ASP.NET RoleManager,但并未积极鼓励它。使用RoleManager,用户只需要在配置文件中使用自己更自由的实现替换RoleManager,以绕过精心设计的授权规则。

安全的方法是提示输入凭据(或使用Windows凭据),并将这些凭据传递给服务层(数据库直接或例如Web服务)进行身份验证。