2010-03-21 103 views
1

基本设置很经典 - 您正在创建一个Windows Forms应用程序,该应用程序连接到一个数据库并执行各种企业级工作。当然,这样的应用程序将有许多用户在数据库中拥有不同的访问权限,并且每个用户都有自己的登录名和密码。如何确保Windows窗体应用程序的数据库安全性?

那么你如何实现呢?一种方法是为每个应用程序用户创建一个数据库登录,但这是一件相当严重的事情,甚至需要DB服务器上的管理员权限等。如果数据库服务器托管多个应用程序,管理员很可能不会对此感到高兴。

在网络世界中,通常会创建一个自己的“用户”表,其中包含所有必需的信息,并使用一个固定的数据库登录进行所有交互。这对于一个web应用程序来说都很好,但是windows窗体不能隐藏这个主登录信息,完全否定安全性。 (它可以尝试隐藏,但所有这些尝试很容易被打破)。

那么...有一些中间的方式吗?也许可以使用固定登录登录,然后从检查用户名和密码的特殊存储过程中提升权限?

加:好的,所以综合认证和windows群体在大多数情况下似乎是公平的选择,所以我接受了相关的答案。不过,如果任何人都可以想出一个非集成的身份验证解决方案,他们会从我这里得到赞扬。

回答

8

对于WinForms使用Windows组。不需要密码,因为凭据是使用您的应用程序从Windows登录推断的。

这是best practice

基本上:

  • 用户所属的组(假设单结构域)
  • 集团是SQL实例
  • SQL登录映射到数据库的登录用户
  • DB用户属于数据库角色
  • 角色具有对象权限

这是值得拥有的人试图捕捉这里的所有信息

编辑之前先读了起来:

如果你有一个工作组,你仍然可以通过设置sqlbox \鲍勃做到这一点,sqlbox \ hans等在一个sqlbox本地组中。

当有人试图连接(在他的PC上说bob)时,窗口会询问他们的详细信息。只要鲍勃知道他的SQLbox帐户的详细资料,他可以连接。

但后来,我还没有在工作组设置中尝试这个...

+0

同意。如果您熟悉ASP.NET模型,只需将WinForms应用程序视为模拟= true并且单个用户登录。 – 2010-03-21 12:19:09

+0

好吧,如果您有Windows域,这是个好主意。如果你不......那么我认为它不是那么复杂,但仍然有这样的应用程序 - 小公司的应用程序等等。而且这些应用程序更可能使用共享数据库主机。 – 2010-03-21 12:41:43

+0

无论如何Upvoted,但我仍然希望在接受答案之前看到有关非域方案的建议。 – 2010-03-21 12:42:22

1

您不能使用Active Directory组来更容易地管理数据库连接吗?

从MSDN ...

名称可以是Windows用户名或Windows组名,域\名称。

这样你可能会有几个组,只读,编辑器,管理器,管理员等。这是我以前用Click-Once应用程序实现过类似的事情。

这真的是你正在做的最好的选择。

我假设这是一个现有的应用程序?如果是新的,我会另外说要使用Web服务或类似的客户端服务器。

PK :-)

1

除了使用Windows域/ AD组(放在合适的角色,AD组在SQL Server中创建,因此所有帐户维护移动到AD),be sure to use the Application Name in your connection string - 这允许您查看哪些应用程序正在执行操作在探查器等

因为当每个人都从不同的应用程序登录为自己 - Windows和Web,它有助于知道它的行动通过应用程序发生,而不仅仅是通过ODBC和Excel进行的任何用户的临时查询,例如(如果您允许用户访问某些视图以进行数据导出或报告wri婷)。

+0

+1。好主意。它并没有使事情变得更加安全,但它可以提供帮助。 – 2010-03-21 13:51:54

+0

@Vilox - 是的,它不会对安全做出贡献,但是当每个人都以自己的身份登录时,您确实丧失了知道他们正在使用哪个应用程序的好处(这是单一应用程序登录的一个小好处) – 2010-03-21 14:09:21

0

关于想要隐藏身份验证并使用WinForms使用单个应用程序登录,如果登录的权限很小 - 仅选择视图并仅在存储过程中执行,任何设法对您的加密进行逆向工程的人您的应用程序中的登录信息将只能执行它们在应用程序中可以执行的相同功能。如果您必须提高安全级别,则可以对每个存储的proc对用户表进行身份验证(为每个SP添加用户和散列)。另外,定期轮换中央应用程序登录。

所有这些都比在您的环境中使用集成身份验证和实施AD平台困难得多。因此,您正在有效地编写自己的目录和身份验证,而不是使用现成的产品。

除了gbn有关工作组与域的更新之外,您还可以使用RUNAS/NETONLY/USER:SERVER \ USER在您的计算机不属于的域或服务器上使用用户凭据运行应用程序。在应用程序建立与数据库的连接时,远程凭证将被认证并使用。我有一个应用程序,实际检查它是如何运行的,如果它没有运行某个特定的开关,它会提示输入用户名和密码,然后使用Windows API使用与RUNAS/NETONLY/USER等效的功能重新运行它自己:域\用户。这是因为我们的工作站目前不在SQL Server的域(或具有信任关系的域)上。在这种情况下,您仍然可以管理SQL Server上本地组或SQL Server域上的组的安全性。你基本上就会失去自动认证令牌。

相关问题