¿Cuál es la diferencia entre Integrated Security = True y Integrated Security = SSPI?

531

Tengo dos aplicaciones que usan seguridad integrada. Uno asigna Integrated Security = trueen la cadena de conexión y el otro establece Integrated Security = SSPI.

¿Cuál es la diferencia entre SSPIy trueen el contexto de la seguridad integrada?

JD
fuente
70
La respuesta aceptada no es la mejor, tampoco es totalmente correcta. Integrated Security = Trueo SSPIno son lo mismo. Integrated Security=true;no funciona en todos los proveedores de SQL, arroja una excepción cuando se usa con el OleDbproveedor. Básicamente, Integrated Security=SSPI;se prefiere ya que funciona con ambos SQLClienty el OleDBproveedor. He agregado una respuesta para una mejor aclaración.
Pranav Singh
3
@PranavSingh tiene la idea correcta, esta pregunta está incompleta a menos que especifique qué proveedor está utilizando. Diferentes proveedores aceptan y / o traducen varias cadenas en estados internos.
Mark
Aunque son lo mismo, creo que había un documento muy antiguo en uno de los sitios web, en ese momento tenía curiosidad por decir lo mismo que usted, si decía que está desarrollando para Windows Mobile (no es lo que ve hoy, los dispositivos antiguos que no recuerdo el sufijo del sistema operativo ya que nunca tuve uno), deben usar SSPI y la contraseña de usuario juntos. pero como nunca escribí uno y no recuerdo la fuente de ese documento, no puedo garantizarlo.
deadManN

Respuestas:

436

Según Microsoft , son lo mismo.

Cuando false, la identificación de usuario y la contraseña se especifican en la conexión. Cuando es verdadero, las credenciales actuales de la cuenta de Windows se usan para la autenticación.
Los valores reconocidos son true, false, yes, no, y sspi(muy recomendable), que es equivalente a true.

cptScarlet
fuente
28
Originalmente, creo que había una diferencia en que "True" usaba NTLM y "SSPI" usaba Kerberos, pero ahora son intercambiables.
SqlRyan
55
No revisé el último comentario, pero si es cierto, debería ser una respuesta, pero no el comentario
Johnny_D
20
@RodneyFoley lo siento, mis pruebas confirman que esta respuesta es correcta y su comentario no lo es. Tal vez funcionó de esa manera una vez, pero ahora no, y no puede proporcionar ninguna referencia a un documento de Microsoft que respalde su opinión.
Kirk Broadhurst
3
De acuerdo con Kirk. El usuario / contraseña se ignora cuando se especifica SSPI - .net 4.0, servidor SQL 2012.
Alex des Pelagos
3
Así que si ellos "son lo mismo" ¿por qué es SSPI "muy recomendable" en lugar de "verdadero" o "sí Esa es la razón por la que vine a esta pregunta ...?
Zé Carlos
171

Integrated Security=true;no funciona en todos los proveedores de SQL, arroja una excepción cuando se usa con el OleDbproveedor.

Básicamente, Integrated Security=SSPI;se prefiere ya que funciona con ambos SQLClienty el OleDBproveedor.

Aquí está el conjunto completo de sintaxis según MSDN - Sintaxis de cadena de conexión (ADO.NET)

! [Sintaxis de autenticación de Windows

Pranav Singh
fuente
73

Usando la autenticación de Windows

Para conectarse al servidor de bases de datos se recomienda utilizar la autenticación de Windows, comúnmente conocida como seguridad integrada. Para especificar la autenticación de Windows, puede usar cualquiera de los siguientes dos pares clave-valor con el proveedor de datos. NET Framework para SQL Server:

 Integrated Security = true;
 Integrated Security = SSPI;

Sin embargo, solo el segundo funciona con el proveedor de datos .NET Framework OleDb . Si establece Integrated Security = trueConnectionString, se genera una excepción.

Para especificar la autenticación de Windows en el proveedor de datos. NET Framework para ODBC, debe usar el siguiente par clave-valor.

Trusted_Connection = yes;

Fuente: MSDN: trabajar con cadenas de conexión

Asereware
fuente
33

Muchas preguntas obtienen respuestas si usamos .Net Reflectorpara ver el código real de SqlConnection:) truey sspison las mismas:

internal class DbConnectionOptions

...

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

...

EDITAR 20.02.2018 ¡ Ahora en .Net Core podemos ver su código abierto en github! Busque el método ConvertValueToIntegratedSecurityInternal:

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

Pavel Biryukov
fuente
2
Esa parte del código es propiedad solo para un caso que se puede explicar por nombre ConvertValueToIntegratedSecurityInternal. Esa propiedad se usa solo cuando el proveedor está SqlClientasí SqlClient, SSPIy trueson iguales, pero no cuando el cliente es OleDbo OracleClient. He aclarado que en stackoverflow.com/a/23637478/704008 con referencia msdn
Pranav Singh
Abajo vota por la razón de Pranav aquí.
Scott
21

Seguridad integrada = Falso: la identificación de usuario y la contraseña se especifican en la conexión. Seguridad integrada = verdadero: las credenciales actuales de la cuenta de Windows se utilizan para la autenticación.

Seguridad integrada = SSPI: esto es equivalente a verdadero.

Podemos evitar los atributos de nombre de usuario y contraseña de la cadena de conexión y usar la seguridad integrada

NITIN KAUSHIK
fuente
13

Déjame comenzar con Integrated Security = false

false La identificación de usuario y la contraseña se especifican en la cadena de conexión.
true Las credenciales de la cuenta de Windows se usan para la autenticación.

Los valores reconocidos son true, false, yes, no, ySSPI .

Si User IDy Passwordse especifican y seguridad integrada se establece en true, a continuación, User IDy Passwordserá ignorado y seguridad integrada se utilizará

kudlatiger
fuente
7

Tenga en cuenta que las cadenas de conexión son específicas de qué y cómo se conecta a los datos. Estos se conectan a la misma base de datos, pero el primero es usar .NET Framework Data Provider para SQL Server. Integrated Security = True no funcionará para OleDb.

  • Fuente de datos = .; Catálogo inicial = aspnetdb; Seguridad integrada = Verdadero
  • Proveedor = SQLOLEDB; Fuente de datos = .; Seguridad integrada = SSPI; Catálogo inicial = aspnetdb

En caso de duda, use las conexiones de datos de Visual Studio Server Explorer.

usuario1874524
fuente
5

True solo es válido si está utilizando la biblioteca .NET SqlClient. No es válido cuando se utiliza OLEDB. Donde SSPI es bvaid en ambos, está utilizando la biblioteca .net SqlClient o OLEDB.

Amit Shishodia
fuente
2

Desde mi punto de vista,

Si no usa Seguridad integrada = SSPI, entonces necesita codificar el nombre de usuario y la contraseña en la cadena de conexión, lo que significa "relativamente inseguro", porque todos los empleados tienen acceso, incluso un ex empleado podría usar la información maliciosamente.

Sathishkumar
fuente
1
La cadena de conexión no es necesariamente visible para ningún empleado.
underscore_d