Selama sekitar 10 tahun saya telah bekerja pada berbagai aplikasi klien desktop in-house dengan penyimpanan data SQL Server. Jarang saya memulai proyek ini - sebagian besar adalah pekerjaan pengambilalihan.
Satu hal yang tampak konstan di mana-mana adalah bahwa ada satu akun pengguna global SQL Server yang digunakan aplikasi ini yang memberikan izin kepada database umum, dan ya dalam beberapa situasi naif itu menggunakan sa
akun pengguna, yang biasanya saya coba perbaiki bila memungkinkan .
Anda tidak dapat menyembunyikan nama pengguna dan kata sandi ini secara efektif yang digunakan aplikasi untuk mengakses database. Mereka biasanya disimpan dalam ini
atau config
berkas, atau mungkin dipanggang ke dalam executable itu sendiri. Dalam semua kasus, mereka dapat dilihat oleh pengguna jika mereka melakukan sedikit penggalian. Dalam satu kasus kami benar-benar menggunakan config
file tetapi dienkripsi, tetapi tentu saja kunci enkripsi harus disimpan dalam executable (kami tidak naif terhadap keterbatasan ini, tetapi itu benar-benar menghentikan orang dari mencari-cari yang cukup pandai untuk melihat config
file).
Semua sistem ini memiliki sistem otentikasi pengguna yang dibangun ke dalam aplikasi, tetapi tentu saja mereka semua dikelola melalui aplikasi itu sendiri, artinya informasi pengguna disimpan dalam database. Aplikasi ini membatasi hal-hal apa saja yang dapat Anda lakukan berdasarkan tingkat akses Anda, tetapi semuanya bisa diperdebatkan jika Anda bisa terhubung ke database dan menjalankan kueri ad-hoc.
Saya tertarik untuk mengetahui apa yang dilakukan sistem lain untuk mengatasi masalah ini. Berikut adalah opsi yang saya tahu:
- Gunakan mekanisme keamanan SQL Server untuk mempertahankan daftar pengguna dan peran, dan membuat aplikasi desktop menambah dan menghapus pengguna melalui kueri T-SQL.
- Alih-alih terhubung langsung ke database, buat beberapa jenis layanan web yang berjalan di server dan masukkan logika otentikasi di sana. Buat setiap permintaan melakukan validasi keamanan.
Opsi pertama agak jelek karena Anda memisahkan pengguna dari basis data sehingga pengguna tidak lagi entitas kelas satu dan Anda tidak dapat merujuk mereka dengan hubungan kunci asing, dll.
Yang kedua sepertinya masalah kinerja utama, dan banyak pekerjaan tambahan, ditambah Anda tidak dapat dengan mudah menggunakan pemetaan ORM seperti NHibernate (saya pikir).
Adakah yang punya pengalaman dengan ini? Praktik terbaik?
Edit
Berpikir lebih banyak, bisakah SQL Server Authentication benar-benar menyelesaikan masalah ini? Misalnya, jika pengguna Anda harus dapat menyisipkan dan memperbarui catatan absen sehingga Anda dapat mengedit absen Anda, tidak mungkin server SQL dapat melarang akses ke baris lain di tabel detail absen, yang berarti Anda juga bisa membaca dan menulis absen orang lain .