В чем разница между интегрированной безопасностью = True и интегрированной безопасностью = SSPI?

531

У меня есть два приложения, которые используют встроенную безопасность. Один назначает Integrated Security = trueв строке подключения, а другой устанавливает Integrated Security = SSPI.

В чем разница между SSPIи trueв контексте интегрированной безопасности?

JD.
источник
70
Принятый ответ не самый лучший, и не совсем правильный. Integrated Security = Trueили SSPIне одинаковы. Integrated Security=true;не работает во всех провайдерах SQL, он генерирует исключение при использовании с OleDbпровайдером. Так что в основном Integrated Security=SSPI;предпочтительнее, так как работает как с поставщиком, так SQLClientи с OleDBпоставщиком. Я добавил ответ для лучшего разъяснения.
Пранав Сингх
3
@PranavSingh имеет правильную идею, этот вопрос является неполным, если вы не укажете, какого провайдера вы используете. Различные поставщики принимают и / или переводят различные строки во внутренние состояния.
Марк
Хотя они одинаковы, я считаю, что на одном из веб-сайтов был очень старый документ, в то время как мне было любопытно так же, как и вам, в котором говорилось, что вы разрабатываете для Windows Mobile (не то, что вы видите сегодня, старые устройства, которые я не помню суффикс ОС, поскольку у меня его никогда не было), вы должны использовать SSPI и пароль пользователя вместе. но так как я никогда не писал ни одного, и я не помню источник этого документа, я не могу гарантировать это.
DeadManN

Ответы:

436

По словам Microsoft , это одно и то же.

Когда falseидентификатор пользователя и пароль указаны в соединении. При значении true для проверки подлинности используются учетные данные текущей учетной записи Windows.
Признанные значения true, false, yes, no, и sspi(настоятельно рекомендуется), что эквивалентно true.

cptScarlet
источник
28
Первоначально, я думаю, что была разница в том, что «True» использовал NTLM, а «SSPI» использовал Kerberos, но теперь они взаимозаменяемы.
SqlRyan
5
Не проверял последний комментарий, но если это правда, должен быть ответом, а не комментарием
Johnny_D
20
@RodneyFoley Извините, мои тесты подтверждают, что этот ответ правильный, а ваш комментарий - нет. Возможно, когда-то так и получалось, но сейчас нет, и вы не можете предоставить ссылку на документ Microsoft, подтверждающую ваше мнение.
Кирк Бродхерст
3
Согласна с Кирком. Имя пользователя / пароль игнорируется, если указан SSPI - .net 4.0, SQL Server 2012.
Алекс де Пелагос
3
Так что, если они «одно и то же», почему SSPI «настоятельно рекомендуется», а не «правда» или «да»? Вот почему я пришел к этому вопросу ...
Зе Карлос
171

Integrated Security=true;не работает во всех провайдерах SQL, он генерирует исключение при использовании с OleDbпровайдером.

Так что в основном Integrated Security=SSPI;предпочтительнее, так как работает как с поставщиком, так SQLClientи с OleDBпоставщиком.

Вот полный набор синтаксисов в соответствии с MSDN - Синтаксис строки подключения (ADO.NET)

! [Синтаксис аутентификации Windows

Пранав Сингх
источник
73

Использование аутентификации Windows

Для подключения к серверу базы данных рекомендуется использовать проверку подлинности Windows, широко известную как встроенная защита. Чтобы указать аутентификацию Windows, вы можете использовать любую из следующих двух пар ключ-значение с поставщиком данных. NET Framework для SQL Server:

 Integrated Security = true;
 Integrated Security = SSPI;

Однако только второй работает с поставщиком данных .NET Framework OleDb . Если вы установили Integrated Security = trueConnectionString, выдается исключение.

Чтобы указать проверку подлинности Windows в поставщике данных. NET Framework для ODBC, вы должны использовать следующую пару ключ-значение.

Trusted_Connection = yes;

Источник: MSDN: Работа со строками подключения

Asereware
источник
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. Это свойство используется только в том случае, если поставщик SqlClientтак и есть SqlClient, SSPIи trueодинаковы, но не когда клиент OleDbили OracleClient. Я уточнил, что в stackoverflow.com/a/23637478/704008 со ссылкой на
MSDN
Здесь голосуйте за причину Пранава.
Скотт
21

Integrated Security = False: идентификатор пользователя и пароль указываются в соединении. Integrated Security = true: для аутентификации используются текущие учетные данные Windows.

Комплексная безопасность = SSPI: это эквивалентно истине.

Мы можем избежать атрибутов имени пользователя и пароля из строки подключения и использовать встроенную защиту

НИТИН КАУШИК
источник
13

Позвольте мне начать с Integrated Security = false

false Идентификатор пользователя и пароль указываются в строке подключения.
true Учетные данные Windows используются для аутентификации.

Признанные значения true, false, yes, no, и SSPI.

Если User IDи Passwordуказаны, и для Integrated Security установлено значение true, тогда User IDи Passwordбудут игнорироваться, и будет использоваться Integrated Security.

kudlatiger
источник
7

Обратите внимание, что строки подключения зависят от того, что и как вы подключаетесь к данным. Они подключаются к одной и той же базе данных, но первый использует поставщик данных .NET Framework для SQL Server. Integrated Security = True не будет работать для OleDb.

  • Источник данных =; Исходный каталог = aspnetdb; Интегрированная безопасность = True
  • Поставщик = SQLOLEDB; Источник данных = .; Интегрированная безопасность = SSPI; Начальный каталог = aspnetdb

В случае сомнений используйте подключения к данным в Visual Studio Server Explorer.

user1874524
источник
5

Значение true только в том случае, если вы используете библиотеку .NET SqlClient. Недействительно при использовании OLEDB. Где SSPI bvaid в обоих случаях вы используете библиотеку .net SqlClient или OLEDB.

Амит Шишодия
источник
2

С моей точки зрения,

Если вы не используете Integrated security = SSPI, то вам нужно жестко указать имя пользователя и пароль в строке подключения, что означает «относительно небезопасный», потому что, поскольку все сотрудники имеют доступ, даже бывший сотрудник мог использовать информацию злонамеренно.

Sathishkumar
источник
1
Строка подключения не обязательно видна любому сотруднику.
underscore_d