代码之家  ›  专栏  ›  技术社区  ›  roman m

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

  •  8
  • roman m  · 技术社区  · 16 年前

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

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

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

    任何信息都将不胜感激。

    编辑:

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

    编辑2:

    在谷歌搜索之后我发现 this article 我会试试的,其他建议都会很感激的。

    6 回复  |  直到 15 年前
        1
  •  2
  •   Peter Gfader    15 年前

    大多数情况下,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. 将连接字符串的用户/传递设置为 认证用户/通行证

    并将thread.currentPrincipal设置为您自己的主体对象

        2
  •  3
  •   Randolpho    15 年前

    既然你没有一个被接受的答案,而且我在研究另一个问题时偶然发现了这个问题,我会尽力给你一些建议。

    正如已经指出的,WinForms应用程序中的用户管理和基于角色的安全性实际上并不能在客户端工作。在一个网络类比中,想象一下只使用JavaScript和cookie来实现所有的安全性,而不在服务器端保留任何信息。默认情况下是不安全的。

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

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

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

        3
  •  2
  •   gts    16 年前

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

    http://msdn.microsoft.com/en-us/library/bb384297.aspx 是官方文件吗 http://aspalliance.com/1595_Client_Application_Services__Part_1 是一个不错的教程(包括截图等)

        4
  •  1
  •   Jonx    15 年前

    我一直在找,直到现在都找不到任何东西。看看这个:

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

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

    但后来我想,是否有人也为WinForms编写了ASPNET控件等价物?这篇文章的开头是: 统一Windows窗体和ASP.NET提供程序以进行凭据管理 http://msdn.microsoft.com/en-us/magazine/cc163807.aspx

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

        5
  •  0
  •   to StackOverflow    16 年前

    对于登录表单,我使用自己的组件,它是对CredentialSuipPromptforCredentials(credentialUI.dll)的p/invoke调用的包装,请参见 this MSDN article 更多信息。它提供了安全记住用户密码的功能。

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

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

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

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

        6
  •  0
  •   Steven    16 年前

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

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

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