从ASP.NET进入WindowsForms应用程序开发我希望看到类似的控件可以使用。令我惊讶的是,我没有看到任何安全控制(登录,用户管理等)
我是否遗漏了某些内容,或者我必须为应用程序实施自己的安全性(基于角色的安全性,用户管理等)?
该应用程序供内部使用(10-20个用户),但由于敏感数据,安全性非常重要。 (MSSQL Server 2005位于后端,.NET 3.5)
任何信息都将不胜感激。
我想我的问题是“在WinForms中是否有类似ASP.NET的成员资格提供程序?”
答案 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调用)验证用户/传递
将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服务)进行身份验证。