Sự khác biệt giữa Bảo mật tích hợp = Bảo ​​mật tích hợp và Bảo mật tích hợp = SSPI là gì?


531

Tôi có hai ứng dụng sử dụng Bảo mật tích hợp. Một gán Integrated Security = truetrong chuỗi kết nối và các bộ khác Integrated Security = SSPI.

Sự khác biệt giữa SSPItruetrong bối cảnh của Bảo mật tích hợp là gì?


70
Câu trả lời được chấp nhận không phải là câu trả lời hay nhất, nó cũng không hoàn toàn chính xác. Integrated Security = Truehoặc SSPIkhông giống nhau. Integrated Security=true;không hoạt động trong tất cả các nhà cung cấp SQL, nó ném một ngoại lệ khi được sử dụng với OleDbnhà cung cấp. Vì vậy, về cơ bản Integrated Security=SSPI;được ưa thích vì làm việc với cả SQLClient& OleDBnhà cung cấp. Tôi đã thêm một câu trả lời để làm rõ hơn.
Pranav Singh

3
@PranavSingh có ý tưởng đúng, câu hỏi này không đầy đủ trừ khi bạn chỉ định nhà cung cấp nào bạn đang sử dụng. Các nhà cung cấp khác nhau chấp nhận và / hoặc dịch các chuỗi khác nhau sang trạng thái nội bộ.
Đánh dấu

Mặc dù chúng giống nhau, tôi tin rằng có một tài liệu rất cũ trong một trang web, vào thời điểm đó tôi cũng tò mò như bạn, nói rằng nếu bạn đang phát triển cho windows mobile (không phải những gì bạn thấy ngày nay, các thiết bị cũ mà tôi đừng nhớ hậu tố hệ điều hành vì tôi chưa từng có), bạn nên sử dụng SSPI và Mật khẩu người dùng cùng nhau. nhưng vì tôi chưa bao giờ viết nó và tôi không nhớ nguồn của tài liệu đó, tôi không thể đảm bảo nó.
deadManN

Câu trả lời:


436

Theo Microsoft họ là những điều tương tự.

Khi false, ID người dùng và mật khẩu được chỉ định trong kết nối. Khi đúng, thông tin đăng nhập tài khoản Windows hiện tại được sử dụng để xác thực.
Giá trị nhận được true, false, yes, no, và sspi(khuyên), tương đương với true.


28
Ban đầu, tôi nghĩ rằng có một sự khác biệt trong đó NTLM "Đúng" đã sử dụng và "SSPI" đã sử dụng Kerberos, nhưng giờ đây chúng có thể hoán đổi cho nhau.
SqlRyan

5
Không kiểm tra nhận xét cuối cùng, nhưng nếu đúng, sẽ là câu trả lời, nhưng không phải là nhận xét
Johnny_D

20
@RodneyFoley xin lỗi, các xét nghiệm của tôi xác nhận rằng câu trả lời này là chính xác và nhận xét của bạn thì không. Có thể nó đã hoạt động theo cách đó một lần, nhưng hiện tại thì không và bạn không thể cung cấp bất kỳ tài liệu tham khảo nào cho tài liệu của Microsoft hỗ trợ ý kiến ​​của bạn.
Kirk Broadhurst

3
Đồng ý với Kirk. Người dùng / mật khẩu bị bỏ qua khi SSPI được chỉ định - .net 4.0, máy chủ SQL 2012.
Alex des Pelagos

3
Vì vậy, nếu chúng "giống nhau" thì tại sao SSPI lại được "khuyến khích mạnh mẽ" thay vì "đúng" hay "có? Đó là lý do tại sao tôi đến với câu hỏi này ...
Zé Carlos

171

Integrated Security=true;không hoạt động trong tất cả các nhà cung cấp SQL, nó ném một ngoại lệ khi được sử dụng với OleDbnhà cung cấp.

Vì vậy, về cơ bản Integrated Security=SSPI;được ưa thích vì hoạt động với cả SQLClient&OleDB nhà cung cấp.

Đây là bộ cú pháp đầy đủ theo MSDN - Cú pháp chuỗi kết nối (ADO.NET)

! [Cú pháp Windows Auth


73

Sử dụng xác thực Windows

Để kết nối với máy chủ cơ sở dữ liệu, nên sử dụng Windows xác thực, thường được gọi là bảo mật tích hợp. Để chỉ định xác thực Windows, bạn có thể sử dụng bất kỳ cặp nào trong hai cặp khóa-giá trị sau với nhà cung cấp dữ liệu. NET Framework cho SQL Server:

 Integrated Security = true;
 Integrated Security = SSPI;

Tuy nhiên, chỉ có thứ hai hoạt động với nhà cung cấp dữ liệu .NET Framework OleDb . Nếu bạn đặt Integrated Security = truecho ConnectionString, một ngoại lệ sẽ được đưa ra.

Để chỉ định xác thực Windows trong nhà cung cấp dữ liệu. NET Framework cho ODBC, bạn nên sử dụng cặp khóa-giá trị sau.

Trusted_Connection = yes;

Nguồn: MSDN: Làm việc với các chuỗi kết nối


33

Nhiều câu hỏi nhận được câu trả lời nếu chúng ta sử dụng .Net Reflectorđể xem mã thực tế của SqlConnection:) truesspigiống nhau:

internal class DbConnectionOptions

...

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

...

EDIT 20.02.2018 Bây giờ trong .Net Core, chúng ta có thể thấy nguồn mở của nó trên github! Tìm kiếm phương thức ConvertValueToIntegratedSecurityI Internalal:

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


2
Phần mã đó là thuộc tính chỉ dành cho một trường hợp có thể giải thích bằng tên ConvertValueToIntegratedSecurityInternal. Thuộc tính đó chỉ được sử dụng khi nhà cung cấp SqlClientở trong SqlClient, SSPI& truegiống nhau nhưng không phải khi khách hàng là OleDbhoặc OracleClient. Tôi đã làm rõ rằng trong stackoverflow.com/a/23637478/704008 với tham chiếu
msDN

Bỏ phiếu cho lý do của Pranav ở đây.
Scott

21

Tích hợp bảo mật = Sai: ID người dùng và mật khẩu được chỉ định trong kết nối. Tích hợp bảo mật = true: thông tin đăng nhập tài khoản Windows hiện tại được sử dụng để xác thực.

Bảo mật tích hợp = SSPI: điều này tương đương với đúng.

Chúng tôi có thể tránh các thuộc tính tên người dùng và mật khẩu từ chuỗi kết nối và sử dụng Bảo mật tích hợp


13

Hãy để tôi bắt đầu với Integrated Security = false

false ID người dùng và mật khẩu được chỉ định trong chuỗi kết nối.
true Thông tin tài khoản Windows được sử dụng để xác thực.

Giá trị công nhận là true, false,yes , no, vàSSPI .

Nếu User IDPasswordđược quy định và an ninh tích hợp được thiết lập để true, sau đó User IDPasswordsẽ bị bỏ qua và an ninh tích hợp sẽ được sử dụng


7

Lưu ý rằng các chuỗi kết nối là cụ thể cho những gìcách bạn đang kết nối với dữ liệu. Chúng đang kết nối với cùng một cơ sở dữ liệu nhưng đầu tiên là sử dụng .NET Framework Data Carrier cho SQL Server. Bảo mật tích hợp = True sẽ không hoạt động đối với OleDb.

  • Nguồn dữ liệu =.; Danh mục ban đầu = aspnetdb; Bảo mật tích hợp = True
  • Nhà cung cấp = SQLOLEDB; Nguồn dữ liệu =.; Bảo mật tích hợp = SSPI; Danh mục ban đầu = aspnetdb

Khi nghi ngờ, hãy sử dụng Kết nối dữ liệu Visual Studio Server Explorer.



2

Theo quan điểm của tôi,

Nếu bạn không sử dụng Tích hợp bảo mật = SSPI, thì bạn cần mã hóa tên người dùng và mật khẩu trong chuỗi kết nối có nghĩa là "tương đối không an toàn" tại sao bởi vì, tất cả các nhân viên đều có quyền truy cập ngay cả nhân viên cũ có thể sử dụng thông tin độc hại.


1
Chuỗi kết nối không nhất thiết phải hiển thị cho bất kỳ nhân viên.
gạch dưới
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.