Bagikan melalui


Membuat Skema Keanggotaan di SQL Server (VB)

oleh Scott Mitchell

Nota

Sejak artikel ini ditulis, penyedia Keanggotaan ASP.NET telah digantikan oleh ASP.NET Identity. Kami sangat menyarankan untuk memperbarui aplikasi untuk menggunakan platform Identitas ASP.NET daripada penyedia Keanggotaan yang ditampilkan pada saat artikel ini ditulis. ASP.NET Identity memiliki sejumlah keunggulan dibandingkan sistem Keanggotaan ASP.NET, termasuk :

  • Performa yang lebih baik
  • Peningkatan ekstensibilitas dan uji coba
  • Dukungan untuk OAuth, OpenID Connect, dan autentikasi dua faktor
  • Dukungan Identitas berbasis klaim
  • Interoperabilitas yang lebih baik dengan ASP.Net Core

Unduh Kode atau Unduh PDF

Tutorial ini dimulai dengan memeriksa teknik untuk menambahkan skema yang diperlukan ke database untuk menggunakan SqlMembershipProvider. Setelah itu, kita akan memeriksa tabel kunci dalam skema dan mendiskusikan tujuan dan kepentingannya. Tutorial ini berakhir dengan memahami cara memberi tahu aplikasi ASP.NET penyedia mana yang harus digunakan oleh kerangka kerja Keanggotaan.

Perkenalan

Dua tutorial sebelumnya diperiksa menggunakan autentikasi formulir untuk mengidentifikasi pengunjung situs web. Kerangka kerja autentikasi formulir memudahkan pengembang untuk memasukkan pengguna ke situs web dan mengingatnya di seluruh kunjungan halaman melalui penggunaan tiket autentikasi. Kelas FormsAuthentication mencakup metode untuk menghasilkan tiket dan menambahkannya ke cookie pengunjung. FormsAuthenticationModule memeriksa semua permintaan masuk dan, bagi mereka yang memiliki tiket autentikasi yang valid, membuat dan mengaitkan GenericPrincipal dan objek FormsIdentity dengan permintaan saat ini. Autentikasi formulir hanyalah mekanisme untuk memberikan tiket autentikasi kepada pengunjung saat masuk dan, pada permintaan berikutnya, mengurai tiket tersebut untuk menentukan identitas pengguna. Agar aplikasi web mendukung akun pengguna, kami masih perlu menerapkan penyimpanan pengguna dan menambahkan fungsionalitas untuk memvalidasi kredensial, mendaftarkan pengguna baru, dan segudang tugas terkait akun pengguna lainnya.

Sebelum ASP.NET 2.0, pengembang bertanggung jawab untuk menerapkan semua tugas-tugas terkait dengan akun pengguna ini. Untungnya tim ASP.NET mengenali kekurangan ini dan memperkenalkan kerangka kerja Keanggotaan dengan ASP.NET 2.0. Kerangka kerja Keanggotaan adalah sekumpulan kelas dalam .NET Framework yang menyediakan antarmuka terprogram untuk menyelesaikan tugas terkait akun pengguna inti. Kerangka kerja ini dibangun di atas model penyedia , yang memungkinkan pengembang untuk menyambungkan implementasi yang disesuaikan ke dalam API standar.

Seperti yang dibahas dalam tutorial Dasar-Dasar Keamanan dan Dukungan ASP.NET, .NET Framework dikirim dengan dua penyedia Keanggotaan bawaan: ActiveDirectoryMembershipProvider dan SqlMembershipProvider. Seperti namanya, SqlMembershipProvider menggunakan database Microsoft SQL Server sebagai penyimpanan pengguna. Untuk menggunakan penyedia ini dalam aplikasi, kita perlu memberi tahu penyedia database apa yang akan digunakan sebagai penyimpanan. Seperti yang mungkin Anda bayangkan, SqlMembershipProvider mengharapkan database penyimpanan pengguna memiliki tabel database, tampilan, dan prosedur tersimpan tertentu. Kita perlu menambahkan skema yang diharapkan ini ke database yang dipilih.

Tutorial ini dimulai dengan memeriksa teknik untuk menambahkan skema yang diperlukan ke database untuk menggunakan SqlMembershipProvider. Setelah itu, kita akan memeriksa tabel kunci dalam skema dan mendiskusikan tujuan dan kepentingannya. Tutorial ini berakhir dengan melihat cara menentukan aplikasi ASP.NET penyedia mana yang harus digunakan kerangka Keanggotaan.

Mari kita mulai!

Langkah 1: Memutuskan Di Mana Menempatkan Penyimpanan Pengguna

Data aplikasi ASP.NET umumnya disimpan dalam sejumlah tabel dalam database. Saat menerapkan skema database SqlMembershipProvider, kita harus memutuskan apakah akan menempatkan skema Keanggotaan dalam database yang sama dengan data aplikasi atau dalam database alternatif.

Saya sarankan menemukan skema Keanggotaan dalam database yang sama dengan data aplikasi karena alasan berikut:

  • Maintainability aplikasi yang datanya dienkapsulasi dalam satu database lebih mudah dipahami, dikelola, dan disebarkan daripada aplikasi yang memiliki dua database terpisah.
  • Integritas Relasional dengan menemukan tabel terkait Keanggotaan dalam database yang sama dengan tabel aplikasi dimungkinkan untuk menetapkan batasan kunci asing antara kunci utama dalam tabel terkait Keanggotaan dan tabel aplikasi terkait.

Memisahkan penyimpanan pengguna dan data aplikasi ke dalam database terpisah hanya masuk akal jika Anda memiliki beberapa aplikasi yang masing-masing menggunakan database terpisah, tetapi perlu berbagi penyimpanan pengguna umum.

Membuat Database

Aplikasi yang telah kami bangun sejak tutorial kedua belum membutuhkan database. Kami memerlukan satu sekarang, bagaimanapun, untuk toko pengguna. Mari kita buat dan kemudian tambahkan ke dalamnya skema yang diperlukan oleh penyedia SqlMembershipProvider (lihat Langkah 2).

Nota

Sepanjang seri tutorial ini kita akan menggunakan database Microsoft SQL Server 2005 Express Edition untuk menyimpan tabel aplikasi dan skema SqlMembershipProvider. Keputusan ini dibuat karena dua alasan: pertama, karena biayanya - gratis - Edisi Ekspres adalah versi SQL Server 2005 yang paling mudah diakses; kedua, database SQL Server 2005 Express Edition dapat ditempatkan langsung di folder App_Data aplikasi web, menjadikannya cinch untuk mengemas database dan aplikasi web bersama-sama dalam satu file ZIP dan untuk menyebarkannya kembali tanpa instruksi penyiapan khusus atau opsi konfigurasi. Jika Anda lebih suka mengikuti menggunakan versi SQL Server non-Express Edition, jangan ragu. Langkah-langkahnya hampir identik. Skema SqlMembershipProvider akan berfungsi dengan versi Microsoft SQL Server 2000 dan yang lebih baru.

Dari Penjelajah Solusi, klik kanan folder App_Data dan pilih Tambahkan Item Baru. (Jika Anda tidak melihat folder App_Data di proyek Anda, klik kanan proyek di Penjelajah Solusi, pilih Tambahkan Folder ASP.NET, dan pilih App_Data.) Dari kotak dialog Tambahkan Item Baru, pilih untuk menambahkan Database SQL baru bernama SecurityTutorials.mdf. Dalam tutorial ini kita akan menambahkan skema SqlMembershipProvider ke database ini; dalam tutorial berikutnya, kami akan membuat tabel tambahan untuk mengambil data aplikasi kami.

Menambahkan Database SQL Baru Bernama SecurityTutorials.mdf Database ke folder App_Data

Gambar 1: Tambahkan Database SQL Baru Bernama SecurityTutorials.mdf Database ke Folder App_Data (Klik untuk melihat gambar ukuran penuh)

Menambahkan database ke folder App_Data secara otomatis menyertakannya dalam tampilan Database Explorer. (Di Visual Studio versi Edisi non-Ekspres, Database Explorer disebut Penjelajah Server.) Buka Database Explorer dan perluas database SecurityTutorials yang baru saja ditambahkan. Jika Anda tidak melihat Database Explorer di layar, buka menu Tampilan dan pilih Database Explorer, atau tekan Ctrl+Alt+S. Seperti yang ditunjukkan Gambar 2, database SecurityTutorials kosong - tidak berisi tabel, tidak ada tampilan, dan tidak ada prosedur tersimpan.

Database SecurityTutorials Saat Ini Kosong

Gambar 2: Database SecurityTutorials Saat Ini Kosong (Klik untuk melihat gambar ukuran penuh)

Langkah 2: Menambahkan SkemaSqlMembershipProviderke Database

SqlMembershipProvider memerlukan sekumpulan tabel, tampilan, dan prosedur tersimpan tertentu untuk diinstal di database penyimpanan pengguna. Objek database yang diperlukan ini dapat ditambahkan menggunakan alat aspnet_regsql.exe. File ini terletak di folder %WINDIR%\Microsoft.Net\Framework\v2.0.50727\.

Nota

Alat aspnet_regsql.exe menawarkan fungsionalitas baris perintah dan antarmuka pengguna grafis. Antarmuka grafis lebih ramah pengguna dan adalah apa yang akan kita periksa dalam tutorial ini. Antarmuka baris perintah berguna ketika penambahan skema SqlMembershipProvider perlu diotomatisasi, seperti dalam skrip build atau skenario pengujian otomatis.

Alat aspnet_regsql.exe digunakan untuk menambahkan atau menghapus layanan aplikasi ASP.NET ke database SQL Server tertentu. Layanan aplikasi ASP.NET mencakup skema untuk SqlMembershipProvider dan SqlRoleProvider, bersama dengan skema untuk penyedia berbasis SQL untuk kerangka kerja ASP.NET 2.0 lainnya. Kita perlu memberikan dua bit informasi ke alat aspnet_regsql.exe:

  • Apakah kita ingin menambahkan atau menghapus layanan aplikasi, dan
  • Database tempat menambahkan atau menghapus skema layanan aplikasi

Dalam meminta database untuk digunakan, alat aspnet_regsql.exe meminta kami untuk memberikan nama server tempat database berada, kredensial keamanan untuk menyambungkan ke database, dan nama database. Jika Anda menggunakan SQL Server Edisi non-Ekspres, Anda harus sudah mengetahui informasi ini, karena ini adalah informasi yang sama yang harus Anda berikan melalui string koneksi saat bekerja dengan database melalui halaman web ASP.NET. Menentukan nama server dan database saat menggunakan database SQL Server 2005 Express Edition di folder App_Data sedikit lebih rumit.

Bagian berikut memeriksa cara mudah untuk menentukan nama server dan database untuk database SQL Server 2005 Express Edition di folder App_Data. Jika Anda tidak menggunakan SQL Server 2005 Express Edition jangan ragu untuk melompat ke bagian Menginstal Layanan Aplikasi.

Menentukan Nama Server dan Database untuk Database Edisi Ekspres SQL Server 2005 di FolderApp_Data

Untuk menggunakan alat aspnet_regsql.exe, kita perlu mengetahui nama server dan database. Nama server localhost\InstanceName. Kemungkinan besar, InstanceName adalah SQLExpress. Namun, jika Anda menginstal SQL Server 2005 Express Edition secara manual (artinya, Anda tidak menginstalnya secara otomatis saat menginstal Visual Studio), maka ada kemungkinan Anda memilih nama instans yang berbeda.

Nama database sedikit lebih sulit untuk ditentukan. Database di folder App_Data biasanya memiliki nama database yang menyertakan pengidentifikasi unik global bersama dengan jalur ke file database. Kita perlu menentukan nama database ini untuk menambahkan skema layanan aplikasi melalui aspnet_regsql.exe.

Cara termampu untuk memastikan nama database adalah dengan memeriksanya melalui SQL Server Management Studio. SQL Server Management Studio menyediakan antarmuka grafis untuk mengelola database SQL Server 2005, tetapi tidak dikirim dengan Edisi Ekspres SQL Server 2005. Kabar baiknya adalah bahwa Anda dapat mengunduh Edisi Ekspres SQL Server Management Studio gratis.

Nota

Jika Anda juga memiliki versi SQL Server 2005 non-Edisi Ekspres yang terinstal di desktop Anda, versi lengkap Management Studio kemungkinan diinstal. Anda dapat menggunakan versi lengkap untuk menentukan nama database, mengikuti langkah yang sama seperti yang diuraikan di bawah ini untuk Edisi Ekspres.

Mulailah dengan menutup Visual Studio untuk memastikan bahwa kunci apa pun yang diberlakukan oleh Visual Studio pada file database ditutup. Selanjutnya, luncurkan SQL Server Management Studio dan sambungkan ke database localhost\InstanceName untuk SQL Server 2005 Express Edition. Seperti disebutkan sebelumnya, kemungkinan nama instansnya adalah SQLExpress. Untuk opsi Autentikasi, pilih Autentikasi Windows.

Sambungkan ke instans SQL Server 2005 Express Edition

Gambar 3: Sambungkan ke Instans Edisi Ekspres SQL Server 2005 (Klik untuk melihat gambar ukuran penuh)

Setelah menyambungkan ke instans SQL Server 2005 Express Edition, Management Studio menampilkan folder untuk Database, pengaturan Keamanan, Objek Server, dan sebagainya. Jika Anda memperluas tab Database, Anda akan melihat bahwa database SecurityTutorials.mdftidak terdaftar dalam instans database - kita perlu melampirkan database terlebih dahulu.

Klik kanan pada folder Database dan pilih Lampirkan dari menu konteks. Ini akan menampilkan kotak dialog Lampirkan Database. Dari sini, klik tombol Tambahkan, telusuri ke database SecurityTutorials.mdf, dan klik OK. Gambar 4 memperlihatkan kotak dialog Lampirkan Database setelah database SecurityTutorials.mdf dipilih. Gambar 5 memperlihatkan Object Explorer Management Studio setelah database berhasil dilampirkan.

Melampirkan Database SecurityTutorials.mdf

Gambar 4: Lampirkan Database SecurityTutorials.mdf ( klikuntuk melihat gambar ukuran penuh)

Database SecurityTutorials.mdf Muncul di folder Database

Gambar 5: Database SecurityTutorials.mdf Muncul di Folder Database (Klik untuk melihat gambar ukuran penuh)

Seperti yang ditunjukkan Gambar 5, database SecurityTutorials.mdf memiliki nama yang agak abstrus. Mari kita ubah menjadi nama yang lebih mudah diingat (dan lebih mudah di ketik). Klik kanan pada database, pilih Ganti Nama dari menu konteks, dan ganti namanya SecurityTutorialsDatabase. Ini tidak mengubah nama file, hanya nama yang digunakan database untuk mengidentifikasi dirinya sendiri ke SQL Server.

Mengganti Nama Database menjadi SecurityTutorialsDatabase

Gambar 6: Ganti nama Database menjadi SecurityTutorialsDatabase( klikuntuk melihat gambar ukuran penuh)

Pada titik ini kita tahu nama server dan database untuk file database SecurityTutorials.mdf: masing-masing localhost\InstanceName dan SecurityTutorialsDatabase. Kami sekarang siap untuk menginstal layanan aplikasi melalui alat aspnet_regsql.exe.

Menginstal Application Services

Untuk meluncurkan alat aspnet_regsql.exe, buka menu mulai dan pilih Jalankan. Masukkan %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe ke dalam kotak teks dan klik OK. Sebagai alternatif, Anda dapat menggunakan Windows Explorer untuk menelusuri folder yang sesuai dan mengklik dua kali file aspnet_regsql.exe. Salah satu pendekatan akan menjaring hasil yang sama.

Menjalankan alat aspnet_regsql.exe tanpa parameter baris perintah akan membuka antarmuka grafis dari Wizard Pengaturan SQL Server ASP.NET. Wizard memudahkan untuk menambahkan atau menghapus layanan aplikasi ASP.NET pada database tertentu. Layar pertama panduan, yang ditunjukkan pada Gambar 7, menerangkan tujuan alat.

Gunakan Panduan Penyetelan SQL Server ASP.NET untuk Menambahkan Skema Keanggotaan

Gambar 7: Gunakan Wizard Penyiapan SQL Server ASP.NET untuk Menambahkan Skema Keanggotaan (Klik untuk melihat gambar ukuran penuh)

Langkah kedua dalam wizard menanyakan apakah kami ingin menambahkan layanan aplikasi atau menghapusnya. Karena kami ingin menambahkan tabel, tampilan, dan prosedur tersimpan yang diperlukan untuk SqlMembershipProvider, pilih opsi Konfigurasikan SQL Server untuk layanan aplikasi. Nantinya, jika Anda ingin menghapus skema ini dari database Anda, jalankan kembali wizard ini, tetapi pilih opsi Hapus informasi layanan aplikasi dari database yang sudah ada.

Pilih Opsi Konfigurasi SQL Server untuk Layanan Aplikasi

Gambar 8: Pilih Opsi Konfigurasikan SQL Server for Application Services (Klik untuk melihat gambar ukuran penuh)

Langkah ketiga meminta informasi database: nama server, informasi autentikasi, dan nama database. Jika Anda telah mengikuti tutorial ini dan telah menambahkan database SecurityTutorials.mdf ke App_Data, lampirkan ke localhost\InstanceName, dan ganti namanya menjadi SecurityTutorialsDatabase, maka gunakan nilai berikut:

  • Server: localhost\InstanceName
  • Autentikasi Windows
  • Database: SecurityTutorialsDatabase

Masukkan Informasi Database

Gambar 9: Masukkan Informasi Database (Klik untuk melihat gambar ukuran penuh)

Setelah memasukkan informasi database, klik Berikutnya. Langkah terakhir meringkas langkah-langkah yang akan diambil. Klik Berikutnya untuk menginstal layanan aplikasi dan kemudian klik Selesai untuk menyelesaikan wizard.

Nota

Jika Anda menggunakan Management Studio untuk melampirkan database dan mengganti nama file database, pastikan untuk melepaskan database dan menutup Management Studio sebelum membuka kembali Visual Studio. Untuk mencopot database SecurityTutorialsDatabase, klik kanan pada nama database dan, dari menu Tugas, pilih Lepaskan.

Setelah menyelesaikan wizard, kembali ke Visual Studio dan navigasikan ke Database Explorer. Buka folder Tabel. Anda akan melihat serangkaian tabel yang namanya dimulai dengan awalan aspnet_. Demikian juga, berbagai tampilan dan prosedur tersimpan dapat ditemukan di bawah folder Tampilan dan Prosedur Tersimpan. Objek database ini membentuk skema layanan aplikasi. Kami akan memeriksa objek database keanggotaan dan khusus peran di Langkah 3.

Berbagai Tabel, Tampilan, dan Prosedur Tersimpan Telah Ditambahkan ke Database

Gambar 10: Berbagai Tabel, Tampilan, dan Prosedur Tersimpan Telah Ditambahkan ke Database (Klik untuk melihat gambar ukuran penuh)

Nota

Antarmuka pengguna grafis alat aspnet_regsql.exe menginstal seluruh skema layanan aplikasi. Tetapi saat menjalankan aspnet_regsql.exe dari baris perintah, Anda dapat menentukan komponen layanan aplikasi tertentu yang akan diinstal (atau dihapus). Oleh karena itu, jika Anda hanya ingin menambahkan tabel, tampilan, dan prosedur tersimpan yang diperlukan untuk penyedia SqlMembershipProvider dan SqlRoleProvider, jalankan aspnet_regsql.exe dari baris perintah. Atau, Anda dapat menjalankan subset skrip pembuatan T-SQL yang sesuai yang digunakan oleh aspnet_regsql.exe. Skrip ini terletak di folder WINDIR%\Microsoft.Net\Framework\v2.0.50727\ dengan nama seperti InstallCommon.sql, InstallMembership.sql, InstallRoles.sql, InstallProfile.sql, InstallSqlState.sql, dan sebagainya.

Pada titik ini kita telah membuat objek database yang diperlukan oleh SqlMembershipProvider. Namun, kita masih perlu menginstruksikan kerangka kerja Keanggotaan bahwa kerangka kerja tersebut harus menggunakan SqlMembershipProvider (versus, katakanlah, ActiveDirectoryMembershipProvider) dan bahwa SqlMembershipProvider harus menggunakan database SecurityTutorials. Kita akan melihat cara menentukan penyedia apa yang akan digunakan dan cara menyesuaikan pengaturan penyedia yang dipilih di Langkah 4. Tapi pertama-tama, mari kita lihat lebih dalam objek database yang baru saja dibuat.

Langkah 3: Melihat Tabel Inti Skema

Saat bekerja dengan kerangka kerja Keanggotaan dan Peran dalam aplikasi ASP.NET, detail implementasi dienkapsulasi oleh penyedia. Dalam tutorial mendatang, kita akan berinteraksi dengan kerangka kerja ini melalui kelas Membership dan Roles .NET Framework. Saat menggunakan API tingkat tinggi ini, kita tidak perlu khawatir dengan detail tingkat rendah, seperti kueri apa yang dijalankan atau tabel apa yang dimodifikasi oleh SqlMembershipProvider dan SqlRoleProvider.

Mengingat hal ini, kita dapat dengan yakin menggunakan kerangka kerja Keanggotaan dan Peran tanpa menjelajahi skema database yang dibuat di Langkah 2. Namun, saat membuat tabel untuk menyimpan data aplikasi, kita mungkin perlu membuat entitas yang terkait dengan pengguna atau peran. Ini membantu memiliki keakraban dengan skema SqlMembershipProvider dan SqlRoleProvider saat menetapkan batasan kunci asing antara tabel data aplikasi dan tabel yang dibuat di Langkah 2. Selain itu, dalam keadaan tertentu yang jarang terjadi, kita mungkin perlu berinteraksi dengan pengguna dan penyimpanan peran langsung di tingkat database (bukan melalui kelas Membership atau Roles).

Mempartisi Penyimpanan Pengguna Ke Dalam Aplikasi

Kerangka kerja Keanggotaan dan Peran dirancang sehingga penyimpanan pengguna dan peran dapat digunakan bersama di berbagai aplikasi. Aplikasi ASP.NET yang menggunakan kerangka kerja Keanggotaan atau Peran harus menentukan partisi aplikasi apa yang akan digunakan. Singkatnya, beberapa aplikasi web dapat menggunakan pengguna dan penyimpanan peran yang sama. Gambar 11 menggambarkan penyimpanan pengguna dan peran yang dipartisi menjadi tiga aplikasi: HRSite, CustomerSite, dan SalesSite. Ketiga aplikasi web ini masing-masing memiliki pengguna dan peran unik mereka sendiri, namun mereka semua secara fisik menyimpan akun pengguna dan informasi peran mereka dalam tabel database yang sama.

akun pengguna dapat dipartisi di beberapa aplikasi

Gambar 11: Akun Pengguna Dapat Dipartisi di Beberapa Aplikasi (Klik untuk melihat gambar ukuran penuh)

Tabel aspnet_Applications adalah yang mendefinisikan partisi ini. Setiap aplikasi yang menggunakan database untuk menyimpan informasi akun pengguna diwakili oleh baris dalam tabel ini. Tabel aspnet_Applications memiliki empat kolom: ApplicationId, ApplicationName, LoweredApplicationName, dan Description. ApplicationId berjenis uniqueidentifier dan merupakan kunci utama tabel; ApplicationName menyediakan nama unik yang ramah manusia untuk setiap aplikasi.

Tabel terkait Keanggotaan dan Peran lainnya menghubungkan kembali ke bidang ApplicationId di aspnet_Applications. Misalnya, tabel aspnet_Users, yang berisi catatan untuk setiap akun pengguna, memiliki bidang kunci asing ApplicationId; ditto untuk tabel aspnet_Roles. Bidang ApplicationId dalam tabel ini menentukan partisi aplikasi tempat akun atau peran pengguna berada.

Menyimpan Informasi Akun Pengguna

Informasi akun pengguna disimpan dalam dua tabel: aspnet_Users dan aspnet_Membership. Tabel aspnet_Users berisi bidang yang menyimpan informasi akun pengguna penting. Tiga kolom yang paling bersangkutan adalah:

  • UserId
  • UserName
  • ApplicationId

UserId adalah kunci primer (dan jenis uniqueidentifier). UserName berjenis nvarchar(256) dan, bersama dengan kata sandi, membentuk kredensial pengguna. (Kata sandi pengguna disimpan dalam tabel aspnet_Membership.) ApplicationId menautkan akun pengguna ke aplikasi tertentu di aspnet_Applications. Ada batasan komposit pada kolom dan . Ini memastikan bahwa dalam aplikasi tertentu setiap UserName unik, namun memungkinkan UserName yang sama digunakan dalam aplikasi yang berbeda.

Tabel aspnet_Membership menyertakan informasi akun pengguna tambahan, seperti kata sandi pengguna, alamat email, tanggal dan waktu masuk terakhir, dan sebagainya. Ada korespondensi satu-ke-satu antara rekaman dalam tabel aspnet_Users dan aspnet_Membership. Hubungan ini dipastikan oleh bidang UserId di aspnet_Membership, yang berfungsi sebagai kunci utama tabel. Seperti tabel aspnet_Users, aspnet_Membership menyertakan bidang ApplicationId yang mengikat informasi ini ke partisi aplikasi tertentu.

Mengamankan Kata Sandi

Informasi kata sandi disimpan dalam tabel aspnet_Membership. SqlMembershipProvider memungkinkan kata sandi disimpan dalam database menggunakan salah satu dari tiga teknik berikut:

  • Hapus - kata sandi disimpan dalam database sebagai teks biasa. Saya sangat tidak menyarankan untuk menggunakan opsi ini. Jika database disusupi - baik itu oleh peretas yang menemukan pintu belakang atau karyawan tidak puas yang memiliki akses ke database - setiap data pengguna rentan diambil.
  • Hashed - kata sandi di-hash menggunakan algoritma hash satu arah dan nilai salt yang dihasilkan secara acak. Nilai hash ini (bersama dengan garam) disimpan dalam database.
  • Terenkripsi - versi kata sandi terenkripsi disimpan dalam database.

Teknik penyimpanan kata sandi yang digunakan tergantung pada pengaturan SqlMembershipProvider yang ditentukan dalam Web.config. Kita akan melihat penyesuaian pengaturan SqlMembershipProvider di Langkah 4. Perilaku defaultnya adalah menyimpan hash kata sandi.

Kolom yang bertanggung jawab untuk menyimpan kata sandi Password, PasswordFormat, dan PasswordSalt. PasswordFormat adalah bidang jenis int yang nilainya menunjukkan teknik yang digunakan untuk menyimpan kata sandi: 0 untuk Clear; 1 untuk Hashed; 2 untuk Terenkripsi. PasswordSalt diberi string yang dihasilkan secara acak terlepas dari teknik penyimpanan kata sandi yang digunakan; nilai PasswordSalt hanya digunakan saat menghitung hash kata sandi. Terakhir, kolom Password berisi data kata sandi yang sebenarnya, baik itu kata sandi teks biasa, hash kata sandi, atau kata sandi terenkripsi.

Tabel 1 menggambarkan seperti apa ketiga kolom ini untuk berbagai teknik penyimpanan saat menyimpan kata sandi MySecret! .

Teknik Penyimpanan<_o3a_p /> Kata Sandi<_o3a_p /> PasswordFormat<_o3a_p /> PasswordSalt<_o3a_p />
Jelas MySecret! 0 tTnkPlesqissc2y2SMEygA==
Diproses dengan hash 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= 1 wFgjUfhdUFOCKQiI61vtiQ==
Dienkripsi 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp 2 LSRzhGS/aa/oqAXGLHJNBw==

Tabel 1: Contoh Nilai untuk Bidang Password-Related Saat Menyimpan Kata Sandi MySecret!

Nota

Algoritma enkripsi atau hash tertentu yang digunakan oleh SqlMembershipProvider ditentukan oleh pengaturan dalam elemen <machineKey>.

Menyimpan Peran dan Hubungan Peran

Kerangka kerja Peran memungkinkan pengembang untuk menentukan sekumpulan peran dan menentukan pengguna apa yang termasuk dalam peran apa. Informasi ini diambil dalam database melalui dua tabel: aspnet_Roles dan aspnet_UsersInRoles. Setiap rekaman dalam tabel aspnet_Roles mewakili peran untuk aplikasi tertentu. Sama seperti tabel aspnet_Users, tabel aspnet_Roles memiliki tiga kolom yang berkaitan dengan diskusi kami:

  • RoleId
  • RoleName
  • ApplicationId

RoleId adalah kunci primer (dan jenis uniqueidentifier). RoleName berjenis nvarchar(256). Dan ApplicationId menautkan akun pengguna ke aplikasi tertentu di aspnet_Applications. Ada batasan UNIQUE komposit pada kolom RoleName dan ApplicationId, memastikan bahwa dalam aplikasi tertentu setiap nama peran unik.

Tabel aspnet_UsersInRoles berfungsi sebagai pemetaan antara pengguna dan peran. Hanya ada dua kolom - UserId dan RoleId - dan bersama-sama mereka membentuk kunci primer komposit.

Langkah 4: Menentukan Penyedia dan Menyesuaikan Pengaturannya

Semua kerangka kerja yang mendukung model penyedia - seperti kerangka kerja Keanggotaan dan Peran - tidak memiliki detail implementasi sendiri dan sebaliknya mendelegasikan tanggung jawab tersebut ke kelas penyedia. Dalam kasus kerangka kerja Keanggotaan, kelas Membership mendefinisikan API untuk mengelola akun pengguna, tetapi tidak berinteraksi langsung dengan penyimpanan pengguna apa pun. Sebaliknya, metode kelas Membership menyerahkan permintaan ke penyedia yang dikonfigurasi - kita akan menggunakan SqlMembershipProvider. Ketika kita memanggil salah satu metode di kelas Membership, bagaimana kerangka kerja Keanggotaan tahu untuk mendelegasikan panggilan ke SqlMembershipProvider?

Kelas Membership memiliki properti Providers yang berisi referensi ke semua kelas penyedia terdaftar yang tersedia untuk digunakan oleh kerangka kerja Keanggotaan. Setiap penyedia terdaftar memiliki nama dan jenis terkait. Nama ini menawarkan cara yang ramah manusia untuk mereferensikan penyedia tertentu dalam koleksi Providers, sementara jenisnya mengidentifikasi kelas penyedia. Selain itu, setiap penyedia terdaftar dapat menyertakan pengaturan konfigurasi. Pengaturan konfigurasi untuk kerangka kerja Keanggotaan mencakup PasswordFormat dan requiresUniqueEmail, di antara banyak lainnya. Lihat Tabel 2 untuk daftar lengkap pengaturan konfigurasi yang digunakan oleh SqlMembershipProvider.

Konten properti Providers ditentukan melalui pengaturan konfigurasi aplikasi web. Secara default, semua aplikasi web memiliki penyedia bernama AspNetSqlMembershipProvider jenis SqlMembershipProvider. Penyedia Keanggotaan default ini terdaftar di machine.config (terletak di %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG):

Peringatan

Sepertinya sampel yang Anda cari telah dipindahkan! Yakinlah kita sedang berupaya menyelesaikan ini.

Seperti yang ditunjukkan oleh markup di atas, elemen <membership> menentukan pengaturan konfigurasi untuk kerangka kerja Keanggotaan sementara elemen turunan <providers> menentukan penyedia terdaftar. Penyedia dapat ditambahkan atau dihapus menggunakan elemen <add> atau <remove>; gunakan elemen <clear> untuk menghapus semua penyedia yang saat ini terdaftar. Seperti yang ditunjukkan oleh markup di atas, machine.config menambahkan penyedia dengan nama AspNetSqlMembershipProvider dengan tipe SqlMembershipProvider.

Selain atribut name dan type, elemen <add> berisi atribut yang menentukan nilai untuk berbagai pengaturan konfigurasi. Tabel 2 mencantumkan pengaturan konfigurasi SqlMembershipProviderspesifik yang tersedia, bersama dengan deskripsi masing-masing.

Nota

Nilai default apa pun yang dicatat dalam Tabel 2 mengacu pada nilai default yang ditentukan dalam kelas SqlMembershipProvider. Perhatikan bahwa tidak semua pengaturan konfigurasi di AspNetSqlMembershipProvider sesuai dengan nilai default kelas SqlMembershipProvider. Misalnya, jika tidak ditentukan dalam penyedia keanggotaan, pengaturan requiresUniqueEmail akan secara otomatis diatur ke benar. Namun, AspNetSqlMembershipProvider mengambil alih nilai default ini dengan secara eksplisit menentukan nilai false.

Pengaturan <_o3a_p /> Deskripsi<_o3a_p />
ApplicationName Ingat bahwa kerangka Keanggotaan memungkinkan satu penyimpanan pengguna dibagi menjadi beberapa bagian di berbagai aplikasi. Pengaturan ini menunjukkan nama partisi aplikasi yang digunakan oleh penyedia Keanggotaan. Jika nilai ini tidak ditentukan secara eksplisit, maka pada saat runtime, nilai tersebut diatur ke nilai jalur root virtual aplikasi.
commandTimeout Menentukan nilai batas waktu perintah SQL (dalam detik). Nilai defaultnya adalah 30.
connectionStringName Nama string koneksi dalam elemen <connectionStrings> yang akan digunakan untuk menyambungkan ke database penyimpanan pengguna. Nilai ini diperlukan.
description Memberikan deskripsi yang ramah manusia tentang penyedia terdaftar.
enablePasswordRetrieval Menentukan apakah pengguna dapat mengambil kata sandi yang terlupakan. Nilai defaultnya adalah false.
enablePasswordReset Menunjukkan apakah pengguna diizinkan untuk mengatur ulang kata sandi mereka. Bawaan ke true.
maxInvalidPasswordAttempts Jumlah maksimum upaya masuk yang gagal yang mungkin terjadi untuk pengguna tertentu selama passwordAttemptWindow yang ditentukan sebelum pengguna dikunci. Nilai defaultnya adalah 5.
minRequiredNonalphanumericCharacters Jumlah minimum karakter non-alfanumerik yang harus muncul dalam kata sandi pengguna. Nilai ini harus antara 0 dan 128; defaultnya adalah 1.
minRequiredPasswordLength Jumlah minimum karakter yang diperlukan dalam kata sandi. Nilai ini harus antara 0 dan 128; defaultnya adalah 7.
name Nama penyedia terdaftar. Nilai ini diperlukan.
passwordAttemptWindow Jumlah menit di mana upaya masuk yang gagal dilacak. Jika pengguna menyediakan kredensial masuk yang tidak valid maxInvalidPasswordAttempts kali dalam jendela yang ditentukan ini, kredensial tersebut akan dikunci. Nilai defaultnya adalah 10.
PasswordFormat Format penyimpanan kata sandi: Clear, Hashed, atau Encrypted. Defaultnya adalah Hashed.
passwordStrengthRegularExpression Jika disediakan, ekspresi reguler ini digunakan untuk mengevaluasi kekuatan kata sandi yang dipilih pengguna saat membuat akun baru atau saat mengubah kata sandi mereka. Nilai default adalah string kosong.
requiresQuestionAndAnswer Menentukan apakah pengguna harus menjawab pertanyaan keamanannya saat mengambil atau mengatur ulang kata sandinya. Nilai defaultnya adalah true.
requiresUniqueEmail Menunjukkan apakah semua akun pengguna dalam partisi aplikasi tertentu harus memiliki alamat email yang unik. Nilai defaultnya adalah true.
type Menentukan jenis penyedia. Nilai ini diperlukan.

Tabel 2: Keanggotaan dan Pengaturan Konfigurasi SqlMembershipProvider

Selain AspNetSqlMembershipProvider, penyedia Keanggotaan lainnya dapat didaftarkan berdasarkan aplikasi demi aplikasi dengan menambahkan markup serupa ke file Web.config.

Nota

Kerangka kerja Peran bekerja dengan cara yang sama: ada penyedia peran terdaftar default di machine.config dan penyedia terdaftar dapat disesuaikan berdasarkan aplikasi demi aplikasi dalam Web.config. Kami akan memeriksa kerangka kerja Peran dan markup konfigurasinya secara rinci dalam tutorial di masa mendatang.

Menyesuaikan PengaturanSqlMembershipProvider

SqlMembershipProvider default (AspNetSqlMembershipProvider) memiliki atribut connectionStringName yang telah diatur menjadi LocalSqlServer. Seperti penyedia AspNetSqlMembershipProvider, nama string koneksi LocalSqlServer ditentukan dalam machine.config.

Peringatan

Sepertinya sampel yang Anda cari telah dipindahkan! Yakinlah kita sedang berupaya menyelesaikan ini.

Seperti yang Anda lihat, string koneksi ini mendefinisikan database Edisi Ekspres SQL 2005 yang terletak di |DataDirectory|aspnetdb.mdf. String |DataDirectory| diterjemahkan pada runtime untuk menunjuk ke direktori ~/App_Data/, sehingga jalur database |DataDirectory|aspnetdb.mdf diterjemahkan ke ~/App_Data/aspnet.mdf.

Jika kami tidak menentukan informasi Penyedia keanggotaan apa pun dalam file Web.config aplikasi kami, aplikasi menggunakan penyedia Keanggotaan terdaftar default, AspNetSqlMembershipProvider. Jika database ~/App_Data/aspnet.mdf tidak ada, runtime ASP.NET akan secara otomatis membuatnya dan menambahkan skema layanan aplikasi. Namun, kami tidak ingin menggunakan database aspnet.mdf; sebaliknya, kita ingin menggunakan database SecurityTutorials.mdf yang kita buat di Langkah 2. Modifikasi ini dapat dicapai dengan salah satu dari dua cara:

  • Tentukan nilai untuk nama string koneksiLocalSqlServerdiWeb.config. Dengan menimpa nilai nama string koneksi LocalSqlServer di Web.config, kita dapat menggunakan penyedia Keanggotaan terdaftar default (AspNetSqlMembershipProvider) dan membuatnya bekerja dengan benar dengan database SecurityTutorials.mdf. Pendekatan ini tidak masalah jika Anda puas dengan pengaturan konfigurasi yang ditentukan oleh AspNetSqlMembershipProvider. Untuk informasi selengkapnya tentang teknik ini, lihat posting blog Scott Guthrie, Mengonfigurasi Layanan Aplikasi ASP.NET 2.0 untuk Menggunakan SQL Server 2000 atau SQL Server 2005.
  • Tambahkan penyedia jenisSqlMembershipProviderterdaftar baru dan konfigurasikan pengaturanconnectionStringNameuntuk menunjuk ke databaseSecurityTutorials.mdf. Pendekatan ini berguna dalam skenario di mana Anda ingin menyesuaikan properti konfigurasi lain selain string koneksi database. Dalam proyek saya sendiri saya selalu menggunakan pendekatan ini karena fleksibilitas dan keterbacaannya.

Sebelum kita dapat menambahkan penyedia terdaftar baru yang mereferensikan database SecurityTutorials.mdf, pertama-tama kita perlu menambahkan nilai string koneksi yang sesuai di bagian <connectionStrings> di Web.config. Markup berikut menambahkan string koneksi baru bernama SecurityTutorialsConnectionString yang mereferensikan database SecurityTutorials.mdf Edisi Ekspres SQL Server 2005 di folder App_Data.

Peringatan

Sepertinya sampel yang Anda cari telah dipindahkan! Yakinlah kita sedang berupaya menyelesaikan ini.

Nota

Jika Anda menggunakan file database alternatif, perbarui string koneksi sesuai kebutuhan. Untuk informasi selengkapnya tentang menyusun string koneksi yang benar, lihat ConnectionStrings.com.

Selanjutnya, tambahkan markup konfigurasi Keanggotaan berikut ke file Web.config. Markup ini mendaftarkan penyedia baru bernama SecurityTutorialsSqlMembershipProvider.

Peringatan

Sepertinya sampel yang Anda cari telah dipindahkan! Yakinlah kita sedang berupaya menyelesaikan ini.

Selain mendaftarkan penyedia SecurityTutorialsSqlMembershipProvider, markup di atas mendefinisikan SecurityTutorialsSqlMembershipProvider sebagai penyedia default (melalui atribut defaultProvider dalam elemen <membership>). Ingat bahwa kerangka kerja Keanggotaan dapat memiliki beberapa penyedia terdaftar. Karena AspNetSqlMembershipProvider terdaftar sebagai penyedia pertama di machine.config, itu berfungsi sebagai penyedia default kecuali kami menunjukkan sebaliknya.

Saat ini, aplikasi kami memiliki dua penyedia terdaftar: AspNetSqlMembershipProvider dan SecurityTutorialsSqlMembershipProvider. Namun, sebelum mendaftarkan penyedia SecurityTutorialsSqlMembershipProvider, kami dapat menghapus semua penyedia yang terdaftar sebelumnya dengan menambahkan elemen <clear /> segera sebelum elemen <add> kami. Ini akan menghapus AspNetSqlMembershipProvider dari daftar penyedia terdaftar, yang berarti bahwa SecurityTutorialsSqlMembershipProvider akan menjadi satu-satunya penyedia Keanggotaan terdaftar. Jika kami menggunakan pendekatan ini, maka kami tidak perlu menandai SecurityTutorialsSqlMembershipProvider sebagai penyedia default, karena itu akan menjadi satu-satunya penyedia Keanggotaan terdaftar. Untuk informasi selengkapnya tentang menggunakan <clear />, lihat Menggunakan <clear /> Ketika Menambahkan Penyedia.

Perhatikan bahwa pengaturan connectionStringNameSecurityTutorialsSqlMembershipProvidermerujuk pada nama string koneksi SecurityTutorialsConnectionString yang baru ditambahkan, serta pengaturan applicationName telah diatur ke nilai 'SecurityTutorials'. Selain itu, pengaturan requiresUniqueEmail telah diatur ke true. Semua opsi konfigurasi lainnya identik dengan nilai dalam AspNetSqlMembershipProvider. Jangan ragu untuk melakukan modifikasi konfigurasi apa pun di sini, jika Anda mau. Misalnya, Anda dapat mengencangkan kekuatan kata sandi dengan memerlukan dua karakter non-alfanumerik alih-alih satu, atau dengan meningkatkan panjang kata sandi menjadi delapan karakter alih-alih tujuh.

Nota

Ingat bahwa kerangka kerja Keanggotaan memungkinkan satu basis data pengguna dibagi untuk beberapa aplikasi. Pengaturan applicationName dari penyedia keanggotaan menunjukkan aplikasi apa yang digunakan penyedia saat bekerja dengan basis data pengguna. Penting bagi Anda untuk secara eksplisit menetapkan nilai untuk pengaturan konfigurasi applicationName karena jika applicationName tidak diatur secara eksplisit, nilai tersebut ditetapkan ke jalur akar virtual aplikasi web saat runtime. Ini berfungsi dengan baik selama jalur akar virtual aplikasi tidak berubah, tetapi jika Anda memindahkan aplikasi ke jalur yang berbeda, pengaturan applicationName juga akan berubah. Ketika ini terjadi, penyedia Keanggotaan akan mulai bekerja dengan partisi aplikasi yang berbeda dari yang sebelumnya digunakan. Akun pengguna yang dibuat sebelum pemindahan akan berada di partisi aplikasi yang berbeda dan pengguna tersebut tidak akan lagi dapat masuk ke situs. Untuk diskusi yang lebih mendalam tentang hal ini, lihat Selalu atur properti applicationName saat mengonfigurasi keanggotaan ASP.NET 2.0 dan penyedia lainnya.

Ringkasan

Pada titik ini kami memiliki database dengan layanan aplikasi yang dikonfigurasi (SecurityTutorials.mdf) dan telah mengonfigurasi aplikasi web kami sehingga kerangka kerja Keanggotaan menggunakan penyedia SecurityTutorialsSqlMembershipProvider yang baru saja kami daftarkan. Penyedia terdaftar ini berjenis SqlMembershipProvider dan telah menetapkan connectionStringName ke string koneksi yang sesuai (SecurityTutorialsConnectionString) serta menetapkan nilai applicationName secara eksplisit.

Kami sekarang siap untuk menggunakan kerangka kerja Keanggotaan dari aplikasi kami. Dalam tutorial berikutnya kita akan memeriksa cara membuat akun pengguna baru. Setelah itu kita akan menjelajahi autentikasi pengguna, melakukan otorisasi berbasis pengguna, dan menyimpan informasi terkait pengguna tambahan dalam database.

Selamat Pemrograman!

Bacaan Lebih Lanjut

Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:

Pelatihan Video tentang Topik yang Terkandung dalam Tutorial ini

Tentang Penulis

Scott Mitchell, penulis beberapa buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Scott dapat dijangkau di mitchell@4guysfromrolla.com atau melalui blognya di http://ScottOnWriting.NET.

Terima kasih khusus untuk

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Alicja Maziarz. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, kirimkan saya pesan di mitchell@4GuysFromRolla.com.