Integrated Security = True和Integrated Security = SSPI有什么区别?


531

我有两个使用Integrated Security的应用程序。一个分配Integrated Security = true连接字符串,另一个分配Integrated Security = SSPI

是什么区别SSPI,并true在集成安全性的情况下?


70
公认的答案不是最佳答案,也不是完全正确的答案。Integrated Security = True还是SSPI不一样。Integrated Security=true;并非在所有SQL提供程序中都有效,与OleDb提供程序一起使用时会引发异常。所以基本上Integrated Security=SSPI;是首选,因为与SQLClientOleDBprovider 都可以使用。我添加了一个答案,以进行更好的说明。
Pranav Singh 2014年

3
@PranavSingh是个正确的主意,除非您指定使用的是哪个提供程序,否则这个问题是不完整的。不同的提供者接受和/或将各种字符串转换为内部状态。
2014年

尽管它们是相同的,但我相信其中一个网站中有一个非常旧的文档,当时我和您一样好奇,这表明如果您是针对Windows Mobile开发的(不是您今天看到的,那是我不要记得操作系统的后缀,因为我从来没有一个),您应该同时使用SSPI和用户密码。但是由于我从没写过,并且我不记得该文档的来源,所以我不能保证。
deadManN

Answers:


436

根据微软的说法,它们是同一回事。

如果为false,则在连接中指定用户ID和密码。设置为true时,将使用当前Windows帐户凭据进行身份验证。
被识别的值truefalseyesno,和sspi(强烈推荐),这相当于true


28
最初,我认为“ True”使用NTLM和“ SSPI”使用Kerberos是有区别的,但是它们现在可以互换。
SqlRyan

5
没有检查最后的评论,但如果为true,则应作为答案,而不是评论
Johnny_D 2012年

20
@RodneyFoley很抱歉,我的测试确认此答案正确,而您的评论不正确。也许它曾经以这种方式工作过,但现在却没有,您无法提供任何支持您观点的Microsoft文档参考。
柯克·布罗德赫斯特

3
同意柯克。SSPI指定当用户/密码被忽略- .NET 4.0,SQL Server 2012的
亚历克斯·德Pelagos酒店

3
所以,如果他们“是同一个东西”为什么是SSPI“强烈推荐”,而不是“真”或“是的,这就是为什么我来到这个问题的原因...?
泽·卡洛斯

171

Integrated Security=true;并非在所有SQL提供程序中都有效,与OleDb提供程序一起使用时会引发异常。

所以基本上Integrated Security=SSPI;是首选,因为与SQLClientOleDBprovider 都可以使用。

这是根据MSDN的完整语法集-连接字符串语法(ADO.NET)

![Windows Auth语法


73

使用Windows身份验证

建议连接到数据库服务器使用Windows身份验证,通常称为集成安全性。要指定Windows身份验证,可以将以下两个键值对中的任何一个与数据提供程序一起使用。NET Framework for SQL Server:

 Integrated Security = true;
 Integrated Security = SSPI;

但是,只有第二个可以与数据提供程序.NET Framework OleDb一起使用。如果Integrated Security = true为ConnectionString 设置,则会引发异常。

在数据提供程序中指定Windows身份验证。NET Framework for ODBC,您应该使用以下键/值对。

Trusted_Connection = yes;

来源:MSDN:使用连接字符串


33

如果我们.Net Reflector用来查看SqlConnection:) 的实际代码,很多问题都会得到答案。true并且sspi都是相同的:

internal class DbConnectionOptions

...

internal bool ConvertValueToIntegratedSecurityInternal(string stringValue)
{
    if ((CompareInsensitiveInvariant(stringValue, "sspi") || CompareInsensitiveInvariant(stringValue, "true")) || CompareInsensitiveInvariant(stringValue, "yes"))
    {
        return true;
    }
}

...

编辑20.02.2018 现在在.Net Core中,我们可以在github上看到其开源代码!搜索ConvertValueToIntegratedSecurityInternal方法:

https://github.com/dotnet/corefx/blob/fdbb160aeb0fad168b3603dbdd971d568151a0c8/src/System.Data.SqlClient/src/System/Data/Common/DbConnectionOptions.cs


2
这部分代码仅在一种情况下才是属性,这种情况可以用名称解释ConvertValueToIntegratedSecurityInternal。仅当provider SqlClient处于&中并且&相同时才使用该属性SqlClient,而当client为or 时则不使用。我已经阐明,在具有msdn参考的stackoverflow.com/a/23637478/704008中SSPItrueOleDbOracleClient
Pranav Singh

出于Pranav的原因在这里投反对票。
斯科特,

21

集成安全性= False:在连接中指定了用户ID和密码。集成安全性= true:当前Windows帐户凭据用于身份验证。

集成安全性= SSPI:这等同于true。

我们可以避免使用连接字符串中的用户名和密码属性,而使用集成安全性


13

让我开始 Integrated Security = false

false 用户ID和密码在连接字符串中指定。
true Windows帐户凭据用于身份验证。

可识别的值为truefalseyesno,和SSPI

如果User IDPassword指定,并集成安全性设置为true,那么User IDPassword将被忽略,集成的安全性将使用


7

需要注意的是连接字符串特定于什么如何您要连接到的数据。它们正在连接到相同的数据库,但第一个使用的是用于SQL Server的.NET Framework数据提供程序。集成安全性= True对OleDb不起作用。

  • 数据源= .;初始目录= aspnetdb;集成安全性= True
  • Provider = SQLOLEDB;数据源= .;集成安全性= SSPI;初始目录= aspnetdb

如有疑问,请使用Visual Studio服务器资源管理器数据连接。



2

在我看来,

如果您不使用Integrated security = SSPI,那么您需要在连接字符串中对用户名和密码进行硬编码,这意味着“相对不安全”,原因是,所有员工甚至前雇员都可以恶意使用该信息。


1
连接字符串不一定对任何员工可见。
underscore_d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.