ฉันมีสองแอพที่ใช้การรักษาความปลอดภัยแบบรวม หนึ่งได้รับมอบหมายในสตริงการเชื่อมต่อและชุดอื่นIntegrated Security = true
ๆIntegrated Security = SSPI
อะไรคือความแตกต่างระหว่างSSPI
และtrue
ในบริบทของ Integrated Security?
ฉันมีสองแอพที่ใช้การรักษาความปลอดภัยแบบรวม หนึ่งได้รับมอบหมายในสตริงการเชื่อมต่อและชุดอื่นIntegrated Security = true
ๆIntegrated Security = SSPI
อะไรคือความแตกต่างระหว่างSSPI
และtrue
ในบริบทของ Integrated Security?
คำตอบ:
ตามMicrosoftพวกเขาเป็นสิ่งเดียวกัน
เมื่อ
false
ระบุ ID ผู้ใช้และรหัสผ่านในการเชื่อมต่อ เมื่อเป็นจริงข้อมูลประจำตัวของบัญชี Windows ปัจจุบันจะใช้สำหรับการตรวจสอบ
ค่าได้รับการยอมรับเป็นtrue
,false
,yes
,no
และsspi
(ขอแนะนำ)true
ซึ่งเทียบเท่ากับ
Integrated Security=true;
ไม่สามารถใช้งานได้กับผู้ให้บริการ SQL ทั้งหมด แต่จะมีข้อยกเว้นเมื่อใช้กับOleDb
ผู้ให้บริการ
ดังนั้นจึงIntegrated Security=SSPI;
เป็นที่ต้องการเนื่องจากทำงานร่วมกับทั้งSQLClient
& OleDB
ผู้ให้บริการ
นี่คือชุดของไวยากรณ์แบบเต็มตามMSDN - ไวยากรณ์สตริงการเชื่อมต่อ (ADO.NET)
การใช้ Windows Authentication
ในการเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลขอแนะนำให้ใช้ Windows Authentication หรือที่รู้จักกันทั่วไปว่าเป็นระบบความปลอดภัยแบบรวม ในการระบุการตรวจสอบสิทธิ์ Windows คุณสามารถใช้คู่คีย์ - ค่าใดคู่หนึ่งต่อไปนี้กับผู้ให้บริการข้อมูล NET Framework สำหรับ SQL Server:
Integrated Security = true;
Integrated Security = SSPI;
แต่เพียงผลงานที่สองกับการให้บริการข้อมูล.NET Framework OleDb หากคุณตั้งค่าIntegrated Security = true
สำหรับ ConnectionString ข้อผิดพลาดจะถูกโยนทิ้ง
เพื่อระบุการรับรองความถูกต้องของ Windows ในผู้ให้บริการข้อมูล NET Framework สำหรับ ODBC คุณควรใช้คู่ของคีย์ - ค่าต่อไปนี้
Trusted_Connection = yes;
คำถามมากมายจะได้รับคำตอบถ้าเราใช้.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 วิธีการ:
ConvertValueToIntegratedSecurityInternal
ส่วนหนึ่งของรหัสที่เป็นทรัพย์สินเฉพาะกรณีหนึ่งที่อธิบายได้โดยใช้ชื่อ ทรัพย์สินที่จะใช้เฉพาะเมื่อผู้ให้บริการเป็นSqlClient
ดังนั้นในSqlClient
, SSPI
และtrue
จะเหมือนกัน แต่ไม่เมื่อไคลเอ็นต์หรือOleDb
OracleClient
ฉันได้ชี้แจงว่าในstackoverflow.com/a/23637478/704008พร้อมการอ้างอิง
Integrated Security = False: ID ผู้ใช้และรหัสผ่านถูกระบุในการเชื่อมต่อ Integrated Security = true: ข้อมูลรับรองบัญชี Windows ปัจจุบันใช้สำหรับการตรวจสอบสิทธิ์
Integrated Security = SSPI: สิ่งนี้เทียบเท่ากับจริง
เราสามารถหลีกเลี่ยงแอตทริบิวต์ชื่อผู้ใช้และรหัสผ่านจากสายอักขระการเชื่อมต่อและใช้การรักษาความปลอดภัยแบบรวม
ผมขอเริ่มด้วย Integrated Security = false
false
ID ผู้ใช้และรหัสผ่านถูกระบุในสตริงการเชื่อมต่อ
true
ใช้ข้อมูลรับรองบัญชี Windows สำหรับการตรวจสอบ
ค่าได้รับการยอมรับเป็นtrue
, false
, yes
, และno
SSPI
ถ้าUser ID
และPassword
มีการระบุและการรักษาความปลอดภัยแบบบูรณาการมีการตั้งค่าtrue
แล้วUser ID
และPassword
จะได้รับการปฏิเสธและการรักษาความปลอดภัยแบบบูรณาการจะนำมาใช้
โปรดทราบว่าสตริงการเชื่อมต่อมีความเฉพาะกับสิ่งที่และวิธีที่คุณเชื่อมต่อกับข้อมูล สิ่งเหล่านี้กำลังเชื่อมต่อกับฐานข้อมูลเดียวกัน แต่ตัวแรกกำลังใช้. NET Framework Data Provider สำหรับ SQL Server Integrated Security = True จะไม่ทำงานสำหรับ OleDb
เมื่อมีข้อสงสัยให้ใช้การเชื่อมต่อข้อมูล Visual Studio Server Explorer
True ใช้ได้เฉพาะเมื่อคุณใช้ไลบรารี. NET SqlClient มันไม่ถูกต้องเมื่อใช้ OLEDB โดยที่ SSPI นั้นเป็น bvaid ทั้งที่คุณใช้. net SqlClient library หรือ OLEDB
ในมุมมองของฉัน
หากคุณไม่ใช้ Integrated security = SSPI คุณต้อง hardcode ชื่อผู้ใช้และรหัสผ่านในสตริงการเชื่อมต่อซึ่งหมายความว่า "ค่อนข้างไม่ปลอดภัย" เพราะเหตุใดพนักงานทุกคนมีสิทธิ์เข้าถึงแม้แต่พนักงานเก่าก็สามารถใช้ข้อมูลที่ประสงค์ร้ายได้
Integrated Security = True
หรือSSPI
ไม่เหมือนกันIntegrated Security=true;
ไม่สามารถใช้งานได้กับผู้ให้บริการ SQL ทั้งหมด แต่จะมีข้อยกเว้นเมื่อใช้กับOleDb
ผู้ให้บริการ ดังนั้นจึงIntegrated Security=SSPI;
เป็นที่ต้องการเนื่องจากทำงานร่วมกับทั้งSQLClient
&OleDB
ผู้ให้บริการ ฉันได้เพิ่มคำตอบสำหรับการชี้แจงที่ดีขึ้น