26

我一直认为,为了使用带有显式指定凭据的 Windows 身份验证连接到 SQL Server,您必须先登录用户、模拟,然后再连接。

在我看来,这个链接表明,只需在连接字符串中指定“uid=...;pwd=...”,就可以轻松连接到 SQL 服务器。我测试了这种方法只是为了确保它不起作用,并且 - 你瞧 - 它没有。如果那篇博文不在 msdn.com 上,我会认为它是菜鸟谈话,但确实如此。

有谁知道我错过了什么?

EDIT1:许多受访者误解了我的意思。这是我正在谈论的内容的副本/粘贴。它不是集成的 SQL,也不是由 IIS 进行的 ASP.NET 模拟:

string sql4 = String.Format(
   @"Data Source={0};Integrated Security=SSPI;uid=<uid>;pwd=<pid>", server);     
// Database + Windows Authentication + Username/Password
4

7 回答 7

38

SQL Server 有两种不同的安全性。“Windows 身份验证”和“SQL Server 身份验证”。当您看到 uid 和 pwd 时,您看到的是后者。在这种情况下,uid 不是 Windows 主体——操作系统对此一无所知。

所以你的问题的答案是,,你不能在连接字符串中传递 Windows 用户名和密码来登录 SQL Server。

于 2009-05-06T22:35:23.650 回答
5

这取决于 - 如果您从命令行或 Winforms 应用程序直接连接到您的 SQL Server,您可以指定“Integrated Security=SSPI;” 然后使用您的 Windows 凭据作为登录凭据,或者您指定“用户 id=....;pwd=.....” - 但那是 SQL 登录 - 而不是您的 Windows 登录。

您提到“模拟然后连接”——这似乎表明 ASP.NET——这又是一个完全不同的故事。如果您冒充,那么您基本上是在使用您的 Windows 凭据,例如,Web 服务器将“冒充”您并以您的身份登录(使用您的 Windows 凭据)。在这种情况下,再一次,不需要指定“uid=....;pwd=.....”(如果是,它将被忽略)。

正如您提到的链接清楚地表明 - 如果您可以直接连接,并且您指定“Integrated Security=SSPI;”,那么这优先于您可能还指定并记录的任何 uid=...;pwd=...。您在使用您的 Windows 凭据;那些额外的 uid=...;pwd=.... 部分将被忽略。

马克

于 2009-05-06T18:16:14.040 回答
2

有问题的文章和观点涉及 SQL 安全性,而不是集成安全性。如果启用了 SQL 身份验证(混合模式),您可以传递 SQL 用户的凭据并以这种方式登录。如果 SQL 服务器设置为仅使用集成安全性,那么这将不起作用。允许使用 Windows 登录凭据登录也不起作用。

于 2009-05-06T19:18:23.250 回答
1

在我们的商店中,我们通常使用您描述的连接字符串。没问题。但是你的 sql server 数据库必须设置为使用 sql security,而不是 windows 身份验证。

我们应用程序中的示例连接字符串(来自 web.config)如下所示:

<connectionStrings>
<add name="ConfigurationData" connectionString="server=DevServer;
database=travel_expense_management_dv;uid=userid;pwd=password!;"
providerName="System.Data.SqlClient" />
</connectionStrings>

另一方面,我们商店的 DBA 大师在主服务器上为我设置了一个个人数据库,该数据库与我的 Windows 登录集成了安全性。我不需要 uid 和 pwd,因为它从上下文中获取了我的身份验证信息。

于 2009-05-06T22:49:08.920 回答
1

是的,正如你所说,文章提到了这一点:

string sql4 = String.Format(@"Data Source={0};Integrated Security=SSPI;uid=<uid>;pwd=<pid>", server);     // Database + Windows Authentication + Username/Password

但是,如果您稍后仔细阅读几行,它会说:

字符串 sql4 -> 使用 Windows 登录登录,即。优先于用户名/密码。

:)

于 2014-11-14T14:42:20.193 回答
1

这是很老的,但也许有人有同样的问题。

可以使用WindowsAuthentication在您的连接字符串上指定用户 ID 和密码进行连接,但不是在每台设备上。例如,您可以在 WinCE设备 ( https://technet.microsoft.com/en-us/library/aa275613(v=sql.80).aspx )上实现此目的。

我不知道您是否可以仅使用连接字符串在其他操作系统上执行相同的操作(无需进行模拟操作)。

希望能帮助到你。

于 2015-07-06T21:03:20.623 回答
0

对于仍然遇到此类问题的一些人来说,这只是一个贡献。根据我的经验,如果您未在连接中指定任何用户/密码,它将使用 Windows 身份验证自动连接到数据库。这意味着它将获取用户 ID 和登录机器的用户的凭据。如果系统识别出您的用户 ID 在数据库中存在/创建,系统将允许您连接到数据库。但是,一旦您在连接中指定了用户名和密码,它就会绕过 Windows 身份验证并使用 sql server 身份验证。

于 2016-03-30T05:54:41.717 回答