Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
Nota
Sejak artikel ini ditulis, penyedia Keanggotaan ASP.NET telah digantikan oleh ASP.NET Identity. Kami sangat menyarankan untuk memperbarui aplikasi agar menggunakan platform ASP.NET Identitas sebagai pengganti 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 diakhiri dengan mempelajari bagaimana memberitahu aplikasi ASP.NET tentang penyedia mana yang harus digunakan oleh kerangka 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 dalam 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 yang 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 memberi tahu aplikasi ASP.NET penyedia mana yang harus digunakan kerangka kerja 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. Namun, kami membutuhkannya sekarang 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.
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.
Gambar 2: Database SecurityTutorials
Saat Ini Kosong (Klik untuk melihat gambar ukuran penuh)
Langkah 2: Menambahkan SkemaSqlMembershipProvider
ke 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
memerlukan usaha yang lebih.
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.
Tutup Visual Studio terlebih dahulu untuk memastikan bahwa setiap kunci yang diberlakukan oleh Visual Studio pada file database telah ditutup. Selanjutnya, luncurkan SQL Server Management Studio dan sambungkan ke database localhost\InstanceName
untuk SQL Server 2005 Express Edition. Seperti disebutkan sebelumnya, kemungkinan nama instans adalah SQLExpress
. Untuk opsi Autentikasi, pilih Autentikasi Windows.
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.mdf
tidak 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.
Database SecurityTutorials.mdf
Gambar 4: Lampirkan Database SecurityTutorials.mdf
( klikuntuk melihat gambar ukuran penuh)
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.
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. Atau, Anda dapat menggunakan Windows Explorer untuk menelusuri hingga folder yang sesuai dan klik dua kali file aspnet_regsql.exe
. Salah satu pendekatan akan menjaring hasil yang sama.
Menjalankan alat aspnet_regsql.exe
tanpa argumen baris perintah akan meluncurkan antarmuka pengguna Wizard Pengaturan SQL Server ASP.NET dalam bentuk grafis. Wizard memudahkan untuk menambahkan atau menghapus layanan aplikasi ASP.NET pada database tertentu. Layar pertama wizard, yang ditunjukkan pada Gambar 7, menjelaskan tujuan alat.
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.
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
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 panduan.
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. Perluas 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.
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. Anda juga dapat secara manual menjalankan subset skrip 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 sedemikian rupa sehingga satu penyimpanan pengguna dan peran dapat dibagikan di antara banyak aplikasi yang berbeda. 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.
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 menautkan 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 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 yang tidak puas yang memiliki akses database - setiap kredensial pengguna siap diambil.
- Hashed - kata sandi di-hash menggunakan algoritma hash satu arah dan nilai garam 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== |
Dihash | 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 Asosiasi 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 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 SqlMembershipProvider
spesifik 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 menjadi true secara default. Namun, AspNetSqlMembershipProvider
mengambil alih nilai default ini dengan secara eksplisit menentukan nilai false
.
pengaturan <_o3a_p /> | Deskripsi<_o3a_p /> |
---|---|
ApplicationName |
Ingat bahwa sistem Keanggotaan memungkinkan penyimpanan pengguna tunggal dipartisi di beberapa aplikasi. Pengaturan ini menunjukkan nama partisi aplikasi yang digunakan oleh penyedia Keanggotaan. Jika nilai ini tidak ditentukan secara eksplisit, nilai tersebut akan diatur ke nilai jalur akar virtual aplikasi saat runtime. |
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. Mengatur ulang 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 akan 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 diatur ke 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 koneksi
LocalSqlServer
diWeb.config
. Dengan menimpa nilai nama string koneksiLocalSqlServer
diWeb.config
, kita dapat menggunakan penyedia Keanggotaan terdaftar default (AspNetSqlMembershipProvider
) dan membuatnya bekerja dengan benar dengan databaseSecurityTutorials.mdf
. Pendekatan ini tidak masalah jika Anda puas dengan pengaturan konfigurasi yang ditentukan olehAspNetSqlMembershipProvider
. 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 jenis
SqlMembershipProvider
terdaftar baru dan konfigurasikan pengaturanconnectionStringName
untuk 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 cara membentuk 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 lebih lanjut mengenai penggunaan <clear />
, lihat Menggunakan <clear />
Saat Menambahkan Penyedia.
Perhatikan bahwa pengaturan connectionStringName
pada SecurityTutorialsSqlMembershipProvider
merujuk ke nama string koneksi SecurityTutorialsConnectionString
yang baru ditambahkan, dan pengaturan applicationName
telah diatur dengan 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 sistem Keanggotaan memungkinkan satu penyimpanan pengguna dibagi menjadi beberapa aplikasi. Pengaturan applicationName
penyedia Keanggotaan menunjukkan aplikasi apa yang digunakan penyedia saat bekerja dengan penyimpanan 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 Lain.
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 memiliki connectionStringName
diatur ke string koneksi yang sesuai (SecurityTutorialsConnectionString
) dan nilai applicationName
telah diatur 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:
-
Selalu Atur Properti
applicationName
Saat Mengonfigurasi Keanggotaan ASP.NET 2.0 dan Penyedia Lain - Mengonfigurasi Layanan Aplikasi ASP.NET 2.0 untuk Menggunakan SQL Server 2000 atau SQL Server 2005
- Unduh SQL Server Management Studio
- Memeriksa Keanggotaan, Peran, dan profil ASP.NET 2.0
-
Elemen
<add>
untuk Penyedia Keanggotaan -
Elemen
<membership>
-
Elemen Keanggotaan
<providers>
-
Menggunakan
<clear />
Saat Menambahkan Penyedia -
Bekerja Langsung dengan
SqlMembershipProvider
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.
Ucapan terima kasih khusus kepada
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, hubungi saya di mitchell@4GuysFromRolla.com.