เป็นเวลาประมาณ 10 ปีที่ฉันได้ทำงานกับแอพพลิเคชั่นไคลเอนต์เดสก์ท็อปภายในพร้อมที่เก็บข้อมูล SQL Server ฉันเริ่มทำโครงการเหล่านี้บ่อยครั้ง - ส่วนใหญ่เป็นงานเทคโอเวอร์
สิ่งหนึ่งที่ดูเหมือนว่าคงที่ทุกหนทุกแห่งก็คือมีบัญชีผู้ใช้ SQL Server ส่วนกลางเดียวที่แอปพลิเคชันนี้ใช้ที่ให้สิทธิ์แก่ฐานข้อมูลทั่วไปและใช่ในบางสถานการณ์ที่ไร้เดียงสาที่sa
ใช้บัญชีผู้ใช้ซึ่งโดยทั่วไปฉันพยายามแก้ไขเมื่อทำได้ .
คุณไม่สามารถซ่อนชื่อผู้ใช้และรหัสผ่านนี้ได้อย่างมีประสิทธิภาพซึ่งแอปพลิเคชันใช้ในการเข้าถึงฐานข้อมูล พวกเขามักจะเก็บไว้ในini
หรือconfig
ไฟล์หรืออาจอบลงในตัวปฏิบัติการ ในทุกกรณีผู้ใช้จะมองเห็นได้หากผู้ใช้ทำการขุดเล็กน้อย ในกรณีหนึ่งเราใช้config
ไฟล์จริงแต่เข้ารหัสมัน แต่แน่นอนว่าต้องมีการเข้ารหัสคีย์การเข้ารหัสไว้ในแฟ้มที่ปฏิบัติการได้ (เราไม่ไร้เดียงสาถึงข้อ จำกัด ของเรื่องนี้ แต่มันก็หยุดผู้คนไม่ให้พูดเล่น เพื่อดูconfig
ไฟล์)
ระบบทั้งหมดเหล่านี้มีระบบการพิสูจน์ตัวตนผู้ใช้ที่สร้างไว้ในแอปพลิเคชัน แต่แน่นอนว่าพวกเขาทั้งหมดได้รับการจัดการผ่านแอปพลิเคชันเองซึ่งหมายความว่าข้อมูลผู้ใช้ถูกเก็บไว้ในฐานข้อมูล แอปพลิเคชัน จำกัด สิ่งที่คุณสามารถทำได้ตามระดับการเข้าถึงของคุณ แต่เป็นสิ่งที่สงสัยหากคุณสามารถเชื่อมต่อกับฐานข้อมูลและเรียกใช้คิวรีแบบเฉพาะกิจ
ฉันสนใจที่จะรู้ว่าระบบอื่น ๆ จะแก้ไขปัญหานี้ได้อย่างไร นี่คือตัวเลือกที่ฉันรู้:
- ใช้กลไกความปลอดภัยของ SQL Server เพื่อรักษาผู้ใช้และรายการบทบาทและทำให้แอปพลิเคชันเดสก์ท็อปเพิ่มและลบผู้ใช้ผ่านการสอบถาม T-SQL
- แทนที่จะเชื่อมต่อกับฐานข้อมูลโดยตรงให้สร้างบริการบนเว็บบางประเภทที่ทำงานบนเซิร์ฟเวอร์และวางตรรกะการตรวจสอบสิทธิ์ลงในนั้น ทำให้ทุกคำขอทำการตรวจสอบความปลอดภัย
ตัวเลือกแรกนั้นค่อนข้างน่าเกลียดเพราะคุณแยกผู้ใช้ออกจากฐานข้อมูลดังนั้นผู้ใช้จึงไม่ได้เป็นเอนทิตีชั้นหนึ่งอีกต่อไปและคุณไม่สามารถอ้างอิงพวกเขาด้วยความสัมพันธ์กับกุญแจต่างประเทศเป็นต้น
ครั้งที่สองดูเหมือนว่าจะเป็นปัญหาด้านประสิทธิภาพที่สำคัญและมีงานพิเศษมากมายรวมถึงคุณไม่สามารถใช้โปรแกรมแมป ORM อย่าง NHibernate ได้อย่างง่ายดาย (ฉันคิดว่า)
ใครบ้างมีประสบการณ์กับสิ่งนี้หรือไม่? ปฏิบัติที่ดีที่สุด?
แก้ไข
กำลังคิดอีกเล็กน้อยการพิสูจน์ตัวจริงของเซิร์ฟเวอร์ SQL สามารถแก้ปัญหานี้ได้จริงหรือไม่ ตัวอย่างเช่นหากผู้ใช้ของคุณต้องสามารถแทรกและอัปเดตระเบียนแผ่นเวลาเพื่อให้คุณสามารถแก้ไขแผ่นบันทึกเวลาของคุณไม่มีวิธีที่เซิร์ฟเวอร์ SQL สามารถห้ามการเข้าถึงแถวอื่น ๆ ในตารางรายละเอียดแผ่นเวลาซึ่งหมายความว่าคุณสามารถอ่านและเขียนแผ่นเวลาของผู้อื่นได้