我有两个应用程序使用集成安全。一个在连接字符串中分配Integrated Security = true,另一个设置Integrated Security = SSPI。

在集成安全上下文中,SSPI和true之间的区别是什么?


当前回答

在我看来,

如果你不使用集成安全=SSPI,那么你需要在连接字符串中硬编码用户名和密码,这意味着“相对不安全”,为什么,因为所有的员工都有访问权限,甚至前员工也可以恶意使用信息。

其他回答

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

当为false时,将在连接中指定User ID和Password。当为true时,将使用当前Windows帐户凭据进行身份验证。 可以识别的值为true、false、yes、no和sspi(强烈推荐),这相当于true。

让我从综合安全= false开始

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

识别值为true、false、yes、no和SSPI。

如果指定了“User ID”和“Password”,并且“Integrated Security”设置为“true”,则“User ID”和“Password”将被忽略,“Integrated Security”将被使用

使用Windows认证

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

 Integrated Security = true;
 Integrated Security = SSPI;

然而,只有第二种与数据提供程序。net Framework OleDb一起工作。如果您为ConnectionString设置了Integrated Security = true,则会抛出异常。

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

Trusted_Connection = yes;

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

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

集成安全性= SSPI:这相当于true。

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

如果我们使用。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