数据库 + Windows 身份验证 + 用户名/密码?

Posted

技术标签:

【中文标题】数据库 + Windows 身份验证 + 用户名/密码?【英文标题】:Database + Windows Authentication + Username/Password? 【发布时间】:2010-10-24 06:35:46 【问题描述】:

我一直认为,要使用带有显式指定凭据的 Windows 身份验证连接到 SQL Server,必须先 LogonUser、Impersonate,然后再连接。

在我看来,this link 建议可以轻松连接到 SQL 服务器,只需在连接字符串中指定“uid=...;pwd=...”即可。我测试了这种方法只是为了确保它不起作用,并且 - 你瞧 - 它没有。如果那篇博文不在 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

【问题讨论】:

这可能是用于 sql server 登录。 QUOTING: string sql4 = String.Format(@"Data Source=0;Integrated Security=SSPI;uid=;pwd=", server); // 数据库 + Windows 身份验证 + 用户名/密码 我相信如果同时指定了集成安全性(Windows 身份验证)和用户名/密码,那么集成安全性优先。 【参考方案1】:

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

【讨论】:

【参考方案2】:

这已经很老了,但也许有人有同样的问题。

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

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

希望对你有帮助。

【讨论】:

【参考方案3】:

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

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

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

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

:)

【讨论】:

【参考方案4】:

在我们的商店中,我们经常使用您所描述的连接字符串。没问题。但是你的 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,因为它从上下文中获取了我的身份验证信息。

【讨论】:

【参考方案5】:

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

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

【讨论】:

Integrated Security=SSPI [indicates NT auth];uid=;pwd=[indicates sql auth] - 两个选项在一行中,他们为什么要在这个例子中使用它? 这不是一个例子。这是一篇文章。去看看这篇文章你就明白了。 其实集成安全=SSPI 是一个解决方案...【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

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

马克

【讨论】:

以上是关于数据库 + Windows 身份验证 + 用户名/密码?的主要内容,如果未能解决你的问题,请参考以下文章

用户的表单身份验证和数据库的 Windows?

通过 REST API 传递“Windows 身份验证”?

SQL server2000 windows身份验证失败怎么办

sqlserver忘记SA用户密码,windows身份验证无法使用的情况下应该怎么办?

SQL Server Windows 身份验证安全

Windows 身份验证 - 如何使用代码拒绝用户