我有两个应用程序使用集成安全性。一个在连接字符串中分配Integrated Security = true,另一个设置Integrated Security = SSPI。
在综合安全的背景下,SSPI和true有什么区别?
- 公认的答案不是最好的,也不是完全正确的。Integrated Security = True或SSPI不相同。Integrated Security=true;不适用于所有SQL提供程序,它在与OleDb提供程序一起使用时抛出异常。因此,基本上,Integrated Security=SSPI;是首选的,因为它与SQLClient和OleDb提供商都合作。我已经添加了一个更好的解释的答案。
- @pranavsingh的想法是正确的,这个问题是不完整的,除非你指定你使用的提供者。不同的提供程序接受和/或将不同的字符串转换为内部状态。
- 虽然它们是相同的,但我相信其中一个网站上有一个非常古老的文档,当时我和你一样好奇,上面说如果你正在为Windows Mobile开发(而不是你今天看到的,我不记得操作系统后缀,因为我从来没有),你应该同时使用sspi和用户密码。但因为我从来没有写过,而且我不记得文件的来源,所以我不能保证。
根据微软的说法,它们是一样的。
When false, User ID and Password are specified in the connection. When true, the current Windows account credentials are used for authentication.
Recognized values are true, false, yes, no, and sspi (strongly recommended), which is equivalent to true.
- 最初,我认为"true"使用的是NTLM,而"sspi"使用的是kerberos,这两者之间存在差异,但现在可以互换了。
- 谢谢你的回复。为什么它只与一个而不与另一个一起工作?事实上,如果调用正确的话,当我使用"true"时所得到的错误是关于某个驱动程序的(在2003 Windows服务器上,使用了SQL Server Express)。JD。
- 没有检查上一条评论,但如果为真,则应作为答案,而不是评论
- @RodneyFoley我使用了错误用户名和密码的SSPI,但是它并不关心,而且在net4.0中连接成功。这是预期结果吗?
- @罗德尼·弗利,你有这句话的来源吗?这似乎是不寻常的,因为集成比SQL认证更受欢迎,所以默认为SQL认证的系统似乎不太可能。
- @KirkBroadhurst-msdn-doc用于连接字符串和实际使用。
- @RodneyFoley对不起,不够清楚。你能为那句话提供来源吗?我在谷歌上找不到任何这样的建议。
- @首先,这不是建议,而是事实陈述。其次,我是基于我提到的msdn文档语句的语句源,以及我10多年使用.NET和处理连接字符串的经验。更不用说29个人(迄今为止)似乎同意谁投票赞成我的评论。所以你的消息来源是这个问题和我投票赞成的评论。如果你愿意的话,我会把它作为一个答案贴出来,因为没有一个被接受为答案,领先的一个小姐目前被投了56次。
- @RodneyFoley对不起,我的测试确认这个答案是正确的,而你的评论是错误的。也许它曾经以这种方式运作过,但现在没有了,而且您不能提供任何对支持您观点的Microsoft文档的引用。
- 同意柯克。指定SSPI时忽略用户/密码-.NET 4.0,SQL Server 2012。
- @RodneyFoley和@Kirkbroadhurst:看看其他答案,它看起来可能取决于使用的提供商。如果说System.Data.SqlClient,我发现这篇文章说True意味着User Id和Password将被忽略,SSPI意味着它们将在存在时被使用,但如果不存在,将使用Windows安全。这个链接说真的会忽略它们,但没有提到SSPI。
- 所以,如果它们"是相同的",为什么SSPI"强烈推荐"而不是"正确"或"是"?这就是我提出这个问题的原因…
- @z&233;卡洛斯他们不一样,见stackoverflow.com/a/23637478/704008
- @普拉纳夫辛格:不是我说他们是一样的。是我们正在评论的当前答案…
- @卡洛斯,明白了。不知何故,这是公认的最高票数的答案:)。我为同样的澄清添加了答案
Integrated Security=true;不适用于所有SQL提供程序,它在与OleDb提供程序一起使用时抛出异常。
因此,基本上,Integrated Security=SSPI;是首选的,因为它与SQLClient和OleDb提供商都合作。
下面是根据msdn-连接字符串语法(ado.net)的完整语法集。

使用Windows身份验证
要连接到数据库服务器,建议使用Windows身份验证,通常称为集成安全性。要指定Windows身份验证,可以将以下两个键值对中的任何一个与数据提供程序一起使用。SQL Server的NET框架:
1 2
| Integrated Security = true;
Integrated Security = SSPI; |
但是,只有第二个与数据提供程序.NET Framework OLEDB一起工作。如果为connectionString设置Integrated Security = true,则会引发异常。
在数据提供程序中指定Windows身份验证。NET Framework for ODBC,您应该使用以下键值对。
1
| Trusted_Connection = yes; |
源:msdn:使用连接字符串
如果我们使用.Net Reflector来查看SqlConnection的实际代码,许多问题都会得到答案。true和SSPI相同:
1 2 3 4 5 6 7 8 9 10 11 12 13
| internal class DbConnectionOptions
...
internal bool ConvertValueToIntegratedSecurityInternal(string stringValue)
{
if ((CompareInsensitiveInvariant(stringValue,"sspi") || CompareInsensitiveInvariant(stringValue,"true")) || CompareInsensitiveInvariant(stringValue,"yes"))
{
return true;
}
}
... |
编辑20.02.2018现在在.NET核心中,我们可以在Github上看到它的开放源代码!搜索ConvertValueToIntegratedSecurityInternal方法:
https://github.com/dotnet/corefx/blob/fdbb160aeb0fad168b363dbdd971d568151a0c8/src/system.data.sqlclient/src/system/data/common/dbconnectionoptions.cs
- 代码的这一部分仅适用于一种情况,可以通过名称ConvertValueToIntegratedSecurityInternal来解释。该属性仅在提供者为SqlClient时使用,因此在SqlClient中,SSPI和True是相同的,但在客户为OleDb或OracleClient时不使用。我已经澄清,在stackoverflow.com/a/23637478/704008中,参考了msdn。
integrated security=false:在连接中指定用户ID和密码。集成安全性=真:当前的Windows帐户凭据用于身份验证。
集成安全=SSPI:这等于真。
我们可以避免连接字符串中的用户名和密码属性,并使用集成的安全性
让我从Integrated Security = false开始
连接字符串中指定了false用户ID和密码。使用trueWindows帐户凭据进行身份验证。
已确认的值为true、false、yes、no和SSPI。
如果指定User ID和Password并将集成安全设置为true,则忽略User ID和Password并使用集成安全
请注意,连接字符串特定于您连接到数据的内容和方式。它们正在连接到同一个数据库,但第一个数据库使用的是用于SQL Server的.NET Framework数据提供程序。集成安全性=真对OLEDB无效。
- 数据源=;初始目录=aspnetdb;集成安全性=true
- 提供程序=sqloledb;数据源=;集成安全性=sspi;初始目录=aspnetdb
如果有疑问,请使用Visual Studio Server Explorer数据连接。
只有在使用.NET sqlclient库时,true才有效。使用OLEDB时无效。其中sspi在这两个库中都是bvaid,要么使用.NET sqlclient库,要么使用OLEDB。
- social.msdn.microsoft.com/forums/en-us/…
在我看来,
如果您不使用integrated security=sspi,那么您需要在连接字符串中对用户名和密码进行硬编码,这意味着"相对不安全",原因是,所有员工都有访问权限,即使是前员工也可能恶意使用该信息。