基本设置是经典的 - 您正在创建一个连接到数据库的Windows窗体应用程序,并执行各种企业级的操作。当然,这样的应用程序将有许多用户在数据库中具有不同的访问权限,并且每个用户都有自己的登录名和密码。
那么你如何实现这个呢?一种方法是为每个应用程序用户创建一个DB登录,但这是一个非常严肃的事情,甚至需要DB服务器上的管理员权限等。如果数据库服务器托管多个应用程序,管理员很可能不会对此感到高兴。
在网络世界中,通常会创建自己的“用户”表,其中包含所有必要的信息,并使用一个固定的数据库登录进行所有交互。这对于Web应用程序来说都很不错,但是Windows窗体无法隐藏此主登录信息,完全否定了安全性。 (它可以试图隐藏,但所有这些尝试都很容易被打破)。
所以...有中间道路吗?也许使用固定登录名登录,然后从检查用户名和密码的特殊存储过程中提升权限?
已添加:确定,因此在大多数情况下,集成身份验证和Windows组似乎是一个公平的选择,所以我接受了相关的答案。尽管如此,如果有人能够提出非集成的身份验证解决方案,他们将获得我的支持。
答案 0 :(得分:8)
对于WinForms,请使用Windows组。不需要密码,因为凭据是使用您的应用程序从Windows登录中推断出来的。
基本上:
在有人试图捕获所有信息之前,首先值得一读
编辑:
如果你有一个工作组,你仍然可以通过在sqlbox本地组中设置sqlbox \ bob,sqlbox \ hans等来实现。
当有人试图连接时(比如他的电脑上的bob),Windows会询问他们的详细信息。只要bob知道他的SQLbox帐户详细信息,他就可以连接。
但是,我没有在工作组设置中尝试过这个...
答案 1 :(得分:1)
您是否不能使用Active Directory组来更轻松地管理数据库连接?
来自MSDN ......
名称可以是Windows用户名或Windows组名,格式为DOMAIN \ Name。
这样你可能会有一些小组,只读,编辑,经理,管理员等。这就是我过去使用Click-Once应用程序取得类似成就的方式。
这真的是你正在做的事情的最佳选择。
我假设这是一个现有的应用程序?如果它是新的,我会说要通过网络服务或类似的方式去客户服务器。
PK: - )
答案 2 :(得分:1)
除了使用Windows域/ AD组(将AD组放在您在SQL Server中创建的适当角色,以便所有帐户维护都移至AD),be sure to use the Application Name in your connection string - 这样您就可以查看哪些应用程序正在执行在探查器等操作。
因为当每个人都从不同的应用程序(Windows和Web)登录时,有助于知道它是通过应用程序进行的操作,而不仅仅是任何用户通过ODBC和Excel进行的即时查询,比如说(如果您允许用户)访问某些视图以进行数据导出或报告编写。)
答案 3 :(得分:0)
关于想要隐藏您的身份验证并使用WinForms使用单个应用程序登录,如果登录具有非常少的权限 - 仅选择视图并仅在存储过程上执行,任何设法对登录加密进行反向工程的人应用程序中的信息只能执行它们在您的应用程序中执行的相同功能。如果您必须提高安全性级别,则可以针对您的用户表对每个存储过程进行身份验证(将用户和散列指向每个SP)。此外,定期轮换中央应用程序登录。
所有这些都比在您的环境中使用集成身份验证和实施AD平台困难得多。因此,您可以有效地编写自己的目录和身份验证,而不是使用现成的。
除了gbn关于工作组与域的更新之外,您还可以使用RUNAS / NETONLY / USER:SERVER \ USER在您的计算机不是其成员的域或服务器上运行具有用户凭据的应用程序。在应用程序与数据库建立连接时,将对远程凭据进行身份验证和使用。我有一个应用程序实际上检查它是如何运行的,如果它没有运行特定的开关,它会提示输入用户名和密码,然后使用Windows API使用等效于RUNAS / NETONLY / USER的功能重新运行:域\用户。这是因为我们的工作站当前不在SQL Server的域(或具有信任关系的域)上。在这种情况下,您仍然可以管理SQL Server上的本地组或SQL Server域上的组的安全性。您基本上只会丢失自动身份验证令牌。