8

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

我是否遗漏了什么,或者我必须为应用程序实现自己的安全性(基于角色的安全性、用户管理等)?

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

任何信息,将不胜感激。

编辑:

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

编辑2:

经过一些谷歌搜索后,我找到了这篇文章,我会尝试一下,任何其他建议表示赞赏。

4

6 回答 6

3

由于您没有公认的答案,并且由于我在研究另一个问题时偶然发现了这个问题,因此我将尽力为您提供一些指示。

正如已经指出的那样,win forms应用程序中的用户管理和基于角色的安全性并不是真正可以在客户端工作的东西。在网络类比中,想象一下尝试仅使用 javascript 和 cookie 来实现所有安全性,而不在服务器端保留任何信息。默认情况下它是不安全的。

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

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

该 Web 服务处理系统的所有业务逻辑,并负责连接到数据库。它提供了一个安全的抽象层,并减少了管理用户所需的数据库管理量。您的 win forms 应用程序变成了一个 UI 外壳,只负责处理用户交互和前期数据验证(您还应该在中间层进行验证),不负责其他任何事情。

于 2009-07-23T16:29:02.890 回答
2

微软发布了客户端应用程序服务来做我认为你正在寻找的东西......

http://msdn.microsoft.com/en-us/library/bb384297.aspx是官方文档 http://aspalliance.com/1595_Client_Application_Services__Part_1是一个不错的教程(带有屏幕截图等)

于 2009-04-28T11:45:45.323 回答
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 :-)
 }

否则
通过您自己的方法验证用户/通行证(数据库调用)

  1. 使用通用连接字符串
    (不推荐)
  2. 将连接字符串的用户/密码设置为经过身份验证的用户/密码

并将 Thread.CurrentPrincipal 设置为您自己的 Principal 对象

于 2009-06-28T10:39:11.453 回答
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 文章:Unify Windows Forms and ASP.NET Providers for Credentials Management http://msdn.microsoft.com/en-us/magazine/cc163807.aspx

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

于 2009-07-28T12:09:19.100 回答
0

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

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

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

于 2009-04-24T05:33:54.317 回答
0

对于登录表单,我使用我自己的组件,它是对 CredentialsUIPromptForCredentials (credui.dll) 的 ap/invoke 调用的包装,有关更多信息,请参阅此 MSDN 文章。它提供了安全记住用户密码等功能。

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

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

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

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

于 2009-04-24T05:54:23.253 回答