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
Catatan
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
Dalam tutorial ini kita akan memeriksa cara memvalidasi kredensial pengguna terhadap penyimpanan pengguna Keanggotaan menggunakan cara terprogram dan kontrol Masuk. Kita juga akan melihat cara menyesuaikan tampilan dan perilaku kontrol masuk.
Pengantar
Dalam tutorial sebelumnya kita melihat cara membuat akun pengguna baru dalam kerangka kerja Keanggotaan. Pertama-tama CreateUser
kita melihat pembuatan akun pengguna secara terprogram melalui Membership
metode kelas, lalu diperiksa menggunakan kontrol Web CreateUserWizard. Namun, halaman masuk saat ini memvalidasi kredensial yang disediakan terhadap daftar pasangan nama pengguna dan kata sandi yang dikodekan secara permanen. Kita perlu memperbarui logika halaman masuk sehingga memvalidasi kredensial terhadap penyimpanan pengguna kerangka kerja Keanggotaan.
Sama seperti membuat akun pengguna, kredensial dapat divalidasi secara terprogram atau deklaratif. API Keanggotaan menyertakan metode untuk memvalidasi kredensial pengguna secara terprogram terhadap penyimpanan pengguna. Dan ASP.NET dikirim dengan kontrol Web Masuk, yang merender antarmuka pengguna dengan kotak teks untuk nama pengguna dan kata sandi dan tombol untuk masuk.
Dalam tutorial ini kita akan memeriksa cara memvalidasi kredensial pengguna terhadap penyimpanan pengguna Keanggotaan menggunakan cara terprogram dan kontrol Masuk. Kita juga akan melihat cara menyesuaikan tampilan dan perilaku kontrol masuk. Mari kita mulai!
Langkah 1: Memvalidasi Kredensial Terhadap Penyimpanan Pengguna Keanggotaan
Untuk situs web yang menggunakan autentikasi formulir, pengguna masuk ke situs web dengan mengunjungi halaman masuk dan memasukkan kredensial mereka. Kredensial ini kemudian dibandingkan dengan penyimpanan pengguna. Jika valid, maka pengguna diberikan tiket autentikasi formulir, yang merupakan token keamanan yang menunjukkan identitas dan keaslian pengunjung.
Untuk memvalidasi pengguna terhadap kerangka kerja Keanggotaan, gunakan Membership
metode kelas ValidateUser
. Metode ini ValidateUser
mengambil dua parameter input - username
dan password
- dan mengembalikan nilai Boolean yang menunjukkan apakah kredensial valid. Seperti metode yang CreateUser
kami periksa di tutorial sebelumnya, metode mendelegasikan ValidateUser
validasi aktual ke penyedia Keanggotaan yang dikonfigurasi.
memvalidasi SqlMembershipProvider
kredensial yang disediakan dengan mendapatkan kata sandi pengguna yang ditentukan melalui prosedur tersimpan aspnet_Membership_GetPasswordWithFormat
. Ingat bahwa SqlMembershipProvider
menyimpan kata sandi pengguna menggunakan salah satu dari tiga format: bersihkan, terenkripsi, atau di-hash. Prosedur aspnet_Membership_GetPasswordWithFormat
tersimpan mengembalikan kata sandi dalam format mentahnya. Untuk kata sandi terenkripsi atau di-hash, SqlMembershipProvider
mengubah nilai yang password
diteruskan ke ValidateUser
metode ke dalam status terenkripsi atau hash yang setara dan kemudian membandingkannya dengan apa yang dikembalikan dari database. Jika kata sandi yang disimpan dalam database cocok dengan kata sandi yang diformat yang dimasukkan oleh pengguna, kredensial valid.
Mari kita perbarui halaman login kita (~/Login.aspx
) sehingga memvalidasi kredensial yang disediakan terhadap penyimpanan pengguna kerangka kerja Keanggotaan. Kami membuat halaman masuk ini kembali dalam tutorial Gambaran Umum Autentikasi Formulir, membuat antarmuka dengan dua Kotak Teks untuk nama pengguna dan kata sandi, kotak centang Ingat Saya, dan tombol Masuk (lihat Gambar 1). Kode memvalidasi kredensial yang dimasukkan terhadap daftar pasangan nama pengguna dan kata sandi yang dikodekan secara permanen (Scott/password, Jisun/password, dan Sam/password).
Gambar 1: Antarmuka Halaman Masuk Mencakup Dua Kotak Teks, Daftar Kotak Centang, dan Tombol (Klik untuk melihat gambar ukuran penuh)
Antarmuka pengguna halaman masuk dapat tetap tidak berubah, tetapi kita perlu mengganti penanganan aktivitas tombol Click
Masuk dengan kode yang memvalidasi pengguna terhadap penyimpanan pengguna kerangka kerja keanggotaan. Perbarui penanganan aktivitas sehingga kodenya muncul sebagai berikut:
Protected Sub LoginButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginButton.Click
' Validate the user against the Membership framework user store
If Membership.ValidateUser(UserName.Text, Password.Text) Then
' Log the user into the site
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked)
End If
' If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = True
End Sub
Kode ini sangat sederhana. Kita mulai dengan memanggil Membership.ValidateUser
metode , meneruskan nama pengguna dan kata sandi yang disediakan. Jika metode tersebut mengembalikan True, maka pengguna masuk ke situs melalui FormsAuthentication
metode RedirectFromLoginPage kelas. (Seperti yang telah kita bahas dalamGambaran Umum tutorial Autentikasi Formulir, FormsAuthentication.RedirectFromLoginPage
membuat tiket autentikasi formulir lalu mengalihkan pengguna ke halaman yang sesuai.) Namun, jika kredensial tidak valid, InvalidCredentialsMessage
Label ditampilkan, memberi tahu pengguna bahwa nama pengguna atau kata sandi mereka salah.
Hanya itu saja!
Untuk menguji bahwa halaman masuk berfungsi seperti yang diharapkan, coba masuk dengan salah satu akun pengguna yang Anda buat di tutorial sebelumnya. Atau, jika Anda belum membuat akun, lanjutkan dan buat akun dari ~/Membership/CreatingUserAccounts.aspx
halaman.
Catatan
Ketika pengguna memasukkan kredensialnya dan mengirimkan formulir halaman masuk, kredensial, termasuk kata sandinya, dikirimkan melalui Internet ke server web dalam teks biasa. Itu berarti setiap peretas yang mengintai lalu lintas jaringan dapat melihat nama pengguna dan kata sandi. Untuk mencegah hal ini, penting untuk mengenkripsi lalu lintas jaringan dengan menggunakan Secure Socket Layers (SSL). Ini akan memastikan bahwa kredensial (serta seluruh markup HTML halaman) dienkripsi sejak mereka meninggalkan browser hingga diterima oleh server web.
Cara Kerangka Kerja Keanggotaan Menangani Upaya Masuk yang Tidak Valid
Ketika pengunjung mencapai halaman masuk dan mengirimkan kredensial mereka, browser mereka membuat permintaan HTTP ke halaman login. Jika kredensial valid, respons HTTP menyertakan tiket autentikasi dalam cookie. Oleh karena itu, peretas yang mencoba masuk ke situs Anda dapat membuat program yang secara lengkap mengirim permintaan HTTP ke halaman masuk dengan nama pengguna yang valid dan menebak kata sandi. Jika tebakan kata sandi benar, halaman masuk akan mengembalikan cookie tiket autentikasi, di mana program tahu bahwa itu telah tersandung pada pasangan nama pengguna/kata sandi yang valid. Melalui brute force, program seperti itu mungkin dapat menemukan kata sandi pengguna, terutama jika kata sandi lemah.
Untuk mencegah serangan brute force tersebut, kerangka kerja Keanggotaan mengunci pengguna jika ada sejumlah upaya masuk yang gagal dalam jangka waktu tertentu. Parameter yang tepat dapat dikonfigurasi melalui dua pengaturan konfigurasi penyedia Keanggotaan berikut:
-
maxInvalidPasswordAttempts
- menentukan berapa banyak upaya kata sandi yang tidak valid yang diizinkan untuk pengguna dalam periode waktu sebelum akun dikunci. Nilai defaultnya adalah 5. -
passwordAttemptWindow
- menunjukkan periode waktu dalam menit di mana jumlah upaya masuk yang ditentukan tidak valid akan menyebabkan akun dikunci. Nilai defaultnya adalah 10.
Jika pengguna telah dikunci, dia tidak dapat masuk sampai administrator membuka kunci akunnya. Ketika pengguna dikunci, ValidateUser
metode akan selalu mengembalikan False
, bahkan jika kredensial yang valid disediakan. Meskipun perilaku ini mengurangi kemungkinan bahwa peretas akan masuk ke situs Anda melalui metode brute force, itu akhirnya dapat mengunci pengguna yang valid yang hanya lupa kata sandinya atau secara tidak sengaja memiliki Caps Lock aktif atau mengalami hari pengetikan yang buruk.
Sayangnya, tidak ada alat bawaan untuk membuka kunci akun pengguna. Untuk membuka kunci akun, Anda dapat memodifikasi database secara langsung - mengubah IsLockedOut
bidang dalam aspnet_Membership
tabel untuk akun pengguna yang sesuai - atau membuat antarmuka berbasis web yang mencantumkan akun yang dikunci dengan opsi untuk membuka kuncinya. Kami akan memeriksa pembuatan antarmuka administratif untuk menyelesaikan akun pengguna umum- dan tugas terkait peran dalam tutorial di masa mendatang.
Catatan
Salah satu kelemahan dari ValidateUser
metode ini adalah bahwa ketika kredensial yang disediakan tidak valid, itu tidak memberikan penjelasan mengapa. Kredensial mungkin tidak valid karena tidak ada pasangan nama pengguna/kata sandi yang cocok di penyimpanan pengguna, atau karena pengguna belum disetujui, atau karena pengguna telah dikunci. Di Langkah 4 kita akan melihat cara menampilkan pesan yang lebih rinci kepada pengguna ketika upaya masuk mereka gagal.
Langkah 2: Mengumpulkan Kredensial melalui Kontrol Web Masuk
Kontrol Web Masuk merender antarmuka pengguna default yang sangat mirip dengan yang kami buat kembali dalam tutorial Gambaran Umum Autentikasi Formulir. Menggunakan kontrol Login akan menghemat pekerjaan kami untuk membuat antarmuka untuk mengumpulkan kredensial pengunjung. Selain itu, kontrol Masuk secara otomatis memasukkan pengguna (dengan asumsi kredensial yang dikirimkan valid), sehingga menyelamatkan kami dari keraguan untuk menulis kode apa pun.
Mari kita perbarui Login.aspx
, mengganti antarmuka dan kode yang dibuat secara manual dengan kontrol Masuk. Mulailah dengan menghapus markup dan kode yang ada di Login.aspx
. Anda dapat menghapusnya langsung, atau hanya mengomentarinya. Untuk mengomentari markup deklaratif, kelilingi dengan pemisah <%--
dan --%>
. Anda dapat memasukkan pemisah ini secara manual, atau, seperti yang ditunjukkan Gambar 2, Anda dapat memilih teks untuk dikomentari lalu klik ikon Komentari baris yang dipilih di Toolbar. Demikian pula, Anda dapat menggunakan ikon Komentari baris yang dipilih untuk mengomentari kode yang dipilih di kelas code-behind.
Gambar 2: Komentari Markup Deklaratif dan Kode Sumber yang Ada di Login.aspx (Klik untuk melihat gambar ukuran penuh)
Catatan
Ikon Komentari baris yang dipilih tidak tersedia saat melihat markup deklaratif di Visual Studio 2005. Jika Anda tidak menggunakan Visual Studio 2008, Anda harus menambahkan pemisah <%--
dan --%>
secara manual.
Selanjutnya, seret kontrol Masuk dari Kotak Alat ke halaman dan atur propertinya ID
ke myLogin
. Pada titik ini layar Anda akan terlihat mirip dengan Gambar 3. Perhatikan bahwa antarmuka default kontrol Login menyertakan kontrol TextBox untuk nama pengguna dan kata sandi, Kotak Centang Ingat saya lain kali, dan Tombol Masuk. Ada juga RequiredFieldValidator
kontrol untuk dua Kotak Teks.
Gambar 3: Menambahkan Kontrol Masuk ke Halaman (Klik untuk melihat gambar ukuran penuh)
Dan kita sudah selesai! Ketika tombol Masuk kontrol Masuk diklik, postback akan terjadi dan kontrol Masuk akan memanggil Membership.ValidateUser
metode , meneruskan nama pengguna dan kata sandi yang dimasukkan. Jika kredensial tidak valid, kontrol Masuk menampilkan pesan yang menyatakan hal tersebut. Namun, jika kredensial valid, kontrol Masuk membuat tiket autentikasi formulir dan mengalihkan pengguna ke halaman yang sesuai.
Kontrol Masuk menggunakan empat faktor untuk menentukan halaman yang sesuai untuk mengalihkan pengguna setelah berhasil masuk:
- Apakah kontrol Masuk berada di halaman masuk seperti yang ditentukan oleh
loginUrl
pengaturan dalam konfigurasi autentikasi formulir; nilai default pengaturan ini adalahLogin.aspx
- Kehadiran parameter querystring
ReturnUrl
- Nilai properti kontrol
DestinationUrl
Login - Nilai
defaultUrl
yang ditentukan dalam pengaturan konfigurasi autentikasi formulir; nilai default pengaturan ini adalah Default.aspx
Gambar 4 menggambarkan bagaimana kontrol Login menggunakan empat parameter ini untuk sampai pada keputusan halaman yang sesuai.
Gambar 4: Tambahkan Kontrol Masuk ke Halaman (Klik untuk melihat gambar ukuran penuh)
Luangkan waktu sejenak untuk menguji kontrol Masuk dengan mengunjungi situs melalui browser dan masuk sebagai pengguna yang ada dalam kerangka kerja Keanggotaan.
Antarmuka yang dirender kontrol Login sangat dapat dikonfigurasi. Ada sejumlah properti yang memengaruhi penampilannya; terlebih lagi, kontrol Login dapat dikonversi menjadi templat untuk kontrol yang tepat atas tata letak elemen antarmuka pengguna. Sisa langkah ini memeriksa cara menyesuaikan tampilan dan tata letak.
Menyesuaikan Tampilan Kontrol Login
Pengaturan properti default kontrol Login merender antarmuka pengguna dengan judul ( Masuk ), TextBox dan kontrol Label untuk input nama pengguna dan kata sandi, Kotak Centang Ingat saya lain kali, dan tombol Masuk. Tampilan elemen-elemen ini semuanya dapat dikonfigurasi melalui banyak properti kontrol Login. Selain itu, elemen antarmuka pengguna tambahan - seperti tautan ke halaman untuk membuat akun pengguna baru - dapat ditambahkan dengan mengatur properti atau dua.
Mari kita habiskan beberapa saat untuk mempercepat tampilan kontrol Login kita.
Login.aspx
Karena halaman sudah memiliki teks di bagian atas halaman yang bertuliskan Masuk, judul kontrol Masuk berlebihan. Oleh karena itu, hapus TitleText
nilai properti untuk menghapus judul kontrol Login.
Nama Pengguna: dan Kata Sandi: Label di sebelah kiri dua kontrol TextBox dapat dikustomisasi melalui UserNameLabelText
properti dan PasswordLabelText
masing-masing. Mari kita ubah Nama Pengguna: Label untuk membaca Nama Pengguna:. Gaya Label dan Kotak Teks masing-masing dapat dikonfigurasi melalui LabelStyle
properti dan TextBoxStyle
.
Properti Ingat saya lain kali Teks Kotak Centang dapat diatur melalui properti Kontrol RememberMeText
login, dan status pemeriksaan defaultnya dapat dikonfigurasi melalui RememberMeSet
properti (yang default ke False). Lanjutkan dan atur properti ke RememberMeSet
True sehingga Kotak Centang Ingat saya lain kali akan dicentang secara default.
Kontrol Login menawarkan dua properti untuk menyesuaikan tata letak kontrol antarmuka penggunanya.
PropertiTextLayout
menunjukkan apakah Nama Pengguna: dan Kata Sandi: Label muncul di sebelah kiri Kotak Teks terkait (default), atau di atasnya.
PropertiOrientation
menunjukkan apakah input nama pengguna dan kata sandi terletak secara vertikal (satu di atas yang lain) atau horizontal. Saya akan membiarkan kedua properti ini diatur ke defaultnya, tetapi saya mendorong Anda untuk mencoba mengatur kedua properti ini ke nilai non-default mereka untuk melihat efek yang dihasilkan.
Catatan
Di bagian berikutnya, Mengonfigurasi Tata Letak Kontrol Masuk, kita akan melihat menggunakan templat untuk menentukan tata letak yang tepat dari elemen antarmuka pengguna kontrol Tata Letak.
Bungkus pengaturan properti kontrol Masuk dengan mengatur CreateUserText
properti dan CreateUserUrl
ke Belum terdaftar? Buat akun! dan ~/Membership/CreatingUserAccounts.aspx
, masing-masing. Ini menambahkan hyperlink ke antarmuka kontrol Login yang menunjuk ke halaman yang kita buat di tutorial sebelumnya. Kontrol HelpPageText
login dan HelpPageUrl
properti dan propertiPasswordRecoveryUrl
PasswordRecoveryText
bekerja dengan cara yang sama, menyajikan tautan ke halaman bantuan dan halaman pemulihan kata sandi.
Setelah membuat perubahan properti ini, markup dan tampilan deklaratif kontrol Login Anda akan terlihat mirip dengan yang ditunjukkan pada Gambar 5.
Gambar 5: Nilai Properti Kontrol Masuk Menentukan Tampilannya (Klik untuk melihat gambar ukuran penuh)
Mengonfigurasi Tata Letak Kontrol Masuk
Antarmuka pengguna default kontrol Web Masuk menjabarkan antarmuka dalam HTML <table>
. Tetapi bagaimana jika kita membutuhkan kontrol yang lebih baik atas output yang dirender? Mungkin kita ingin mengganti dengan <table>
serangkaian <div>
tag. Atau bagaimana jika aplikasi kami memerlukan kredensial tambahan untuk autentikasi? Banyak situs web keuangan, misalnya, mengharuskan pengguna untuk menyediakan tidak hanya nama pengguna dan kata sandi, tetapi juga Nomor Identifikasi Pribadi (PIN), atau informasi identifikasi lainnya. Apa pun alasannya, dimungkinkan untuk mengonversi kontrol Login menjadi templat, dari mana kita dapat secara eksplisit menentukan markup deklaratif antarmuka.
Kita perlu melakukan dua hal untuk memperbarui kontrol Login untuk mengumpulkan kredensial tambahan:
- Perbarui antarmuka kontrol Login untuk menyertakan kontrol Web untuk mengumpulkan kredensial tambahan.
- Ambil alih logika autentikasi internal kontrol Masuk sehingga pengguna hanya diautentikasi jika nama pengguna dan kata sandi mereka valid dan kredensial tambahan mereka juga valid.
Untuk menyelesaikan tugas pertama, kita perlu mengonversi kontrol Login menjadi templat dan menambahkan kontrol Web yang diperlukan. Adapun tugas kedua, logika autentikasi kontrol Masuk dapat digantikan dengan membuat penanganan aktivitas untuk peristiwa kontrolAuthenticate
.
Mari kita perbarui kontrol Login sehingga meminta nama pengguna, kata sandi, dan alamat email mereka dan hanya mengautentikasi pengguna jika alamat email yang disediakan cocok dengan alamat email mereka pada file. Pertama-tama kita perlu mengonversi antarmuka kontrol Login menjadi templat. Dari Tag Pintar kontrol Masuk, pilih opsi Konversi ke templat.
Gambar 6: Mengonversi Kontrol Masuk ke Templat (Klik untuk melihat gambar ukuran penuh)
Catatan
Untuk mengembalikan kontrol Masuk ke versi pra-templatnya, klik tautan Reset dari Tag Cerdas kontrol.
Mengonversi kontrol Masuk ke templat menambahkan LayoutTemplate
ke markup deklaratif kontrol dengan elemen HTML dan kontrol Web yang menentukan antarmuka pengguna. Seperti yang ditunjukkan Gambar 7, mengonversi kontrol ke templat akan menghapus sejumlah properti dari jendela Properti, seperti , , CreateUserUrl
dan sebagainyaTitleText
, karena nilai properti ini diabaikan saat menggunakan templat.
Gambar 7: Lebih sedikit Properti yang Tersedia Saat Kontrol Masuk Dikonversi ke Templat (Klik untuk melihat gambar ukuran penuh)
Markup HTML di LayoutTemplate
dapat dimodifikasi sesuai kebutuhan. Demikian juga, jangan ragu untuk menambahkan kontrol Web baru ke templat. Namun, penting bahwa kontrol Web inti kontrol Login tetap berada dalam templat dan mempertahankan nilai yang ID
ditetapkan. Secara khusus, jangan menghapus atau mengganti nama UserName
atau Password
Kotak Teks, RememberMe
Kotak Centang, LoginButton
Tombol, FailureText
Label, atau RequiredFieldValidator
kontrol.
Untuk mengumpulkan alamat email pengunjung, kita perlu menambahkan TextBox ke templat. Tambahkan markup deklaratif berikut antara baris tabel (<tr>
) yang berisi Password
Kotak Teks dan baris tabel yang menyimpan Kotak Centang Ingat saya lain kali:
<tr>
<td align="right">
<asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">Email:</asp:Label>
</td>
<td>
<asp:TextBox ID="Email" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="EmailRequired" runat="server"
ControlToValidate="Email" ErrorMessage="Email is required."
ToolTip="Email is required." ValidationGroup="myLogin">*</asp:RequiredFieldValidator>
</td>
</tr>
Setelah menambahkan Email
Kotak Teks, kunjungi halaman melalui browser. Seperti yang ditunjukkan Gambar 8, antarmuka pengguna kontrol Login sekarang menyertakan kotak teks ketiga.
Gambar 8: Kontrol Masuk Sekarang Menyertakan Kotak Teks untuk Alamat Email Pengguna (Klik untuk melihat gambar ukuran penuh)
Pada titik ini, kontrol Masuk masih menggunakan Membership.ValidateUser
metode untuk memvalidasi kredensial yang disediakan. Secara sesuai, nilai yang dimasukkan ke dalam Email
Kotak Teks tidak memiliki bantalan pada apakah pengguna dapat masuk. Pada Langkah 3 kita akan melihat cara mengambil alih logika autentikasi kontrol Login sehingga kredensial hanya dianggap valid jika nama pengguna dan kata sandi valid dan alamat email yang disediakan cocok dengan alamat email pada file.
Langkah 3: Memodifikasi Logika Autentikasi Kontrol Masuk
Ketika pengunjung memasok kredensialnya dan mengklik tombol Masuk, postingan berikutnya dan kontrol Masuk berlangsung melalui alur kerja autentikasinya. Alur kerja dimulai dengan menaikkan LoggingIn
peristiwa. Setiap penanganan aktivitas yang terkait dengan peristiwa ini dapat membatalkan operasi masuk dengan mengatur properti ke e.Cancel
True
.
Jika operasi masuk tidak dibatalkan, alur kerja akan berlangsung dengan menaikkan Authenticate
peristiwa. Jika ada penanganan aktivitas untuk peristiwa tersebut Authenticate
, maka bertanggung jawab untuk menentukan apakah kredensial yang disediakan valid atau tidak. Jika tidak ada penanganan aktivitas yang ditentukan, kontrol Masuk menggunakan Membership.ValidateUser
metode untuk menentukan validitas kredensial.
Jika kredensial yang disediakan valid, maka tiket autentikasi formulir dibuat, LoggedIn
acara dinaikkan, dan pengguna dialihkan ke halaman yang sesuai. Namun, jika kredensial dianggap tidak valid, makaLoginError
peristiwa dinaikkan dan pesan ditampilkan yang memberi tahu pengguna bahwa kredensial mereka tidak valid. Secara default, jika gagal, kontrol Masuk hanya mengatur FailureText
properti Teks kontrol Label-nya ke pesan kegagalan ( Upaya masuk Anda tidak berhasil. Silakan coba lagi ). Namun, jika properti Kontrol FailureAction
login diatur ke RedirectToLoginPage
, maka kontrol Login mengeluarkan Response.Redirect
ke halaman login yang menambahkan parameter loginfailure=1
querystring (yang menyebabkan kontrol Login menampilkan pesan kegagalan).
Gambar 9 menawarkan bagan alur alur kerja autentikasi.
Gambar 9: Alur Kerja Autentikasi Kontrol Masuk (Klik untuk melihat gambar ukuran penuh)
Catatan
Jika Anda bertanya-tanya kapan Anda akan menggunakan FailureAction
opsi halaman, RedirectToLogin
pertimbangkan skenario berikut. Saat ini halaman master kami Site.master
saat ini memiliki teks, Halo, orang asing yang ditampilkan di kolom kiri ketika dikunjungi oleh pengguna anonim, tetapi bayangkan bahwa kami ingin mengganti teks tersebut dengan kontrol Login. Ini akan memungkinkan pengguna anonim untuk masuk dari halaman mana pun di situs, alih-alih mengharuskan mereka untuk mengunjungi halaman masuk secara langsung. Namun, jika pengguna tidak dapat masuk melalui kontrol Masuk yang dirender oleh halaman master, mungkin masuk akal untuk mengalihkannya ke halaman masuk (Login.aspx
) karena halaman tersebut kemungkinan menyertakan instruksi tambahan, tautan, dan bantuan lainnya - seperti tautan untuk membuat akun baru atau mengambil kata sandi yang hilang - yang tidak ditambahkan ke halaman master.
Authenticate
Membuat Penanganan Aktivitas
Untuk menyambungkan logika autentikasi kustom kami, kita perlu membuat penanganan aktivitas untuk peristiwa kontrol Authenticate
Login. Membuat penanganan aktivitas untuk Authenticate
peristiwa akan menghasilkan definisi penanganan aktivitas berikut:
Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate
End Sub
Seperti yang Anda lihat, penanganan Authenticate
aktivitas diteruskan objek jenis AuthenticateEventArgs
sebagai parameter input kedua. Kelas AuthenticateEventArgs
berisi properti Boolean bernama Authenticated
yang digunakan untuk menentukan apakah kredensial yang disediakan valid. Tugas kita, kemudian, adalah menulis kode di sini yang menentukan apakah kredensial yang disediakan valid atau tidak, dan untuk mengatur e.Authenticate
properti yang sesuai.
Menentukan dan Memvalidasi Kredensial yang Disediakan
Gunakan kontrol UserName
Login dan Password
properti untuk menentukan kredensial nama pengguna dan kata sandi yang dimasukkan oleh pengguna. Untuk menentukan nilai yang dimasukkan ke dalam kontrol Web tambahan (seperti Email
TextBox yang kami tambahkan di langkah sebelumnya), gunakan LoginControlID.FindControl
("controlID
") untuk mendapatkan referensi terprogram ke kontrol Web dalam templat yang propertinya ID
sama dengan controlID
. Misalnya, untuk mendapatkan referensi ke Email
TextBox, gunakan kode berikut:
Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)
Untuk memvalidasi kredensial pengguna, kita perlu melakukan dua hal:
- Pastikan bahwa nama pengguna dan kata sandi yang disediakan valid
- Pastikan bahwa alamat email yang dimasukkan cocok dengan alamat email pada file untuk pengguna yang mencoba masuk
Untuk menyelesaikan pemeriksaan pertama, kita cukup menggunakan metode seperti yang Membership.ValidateUser
kita lihat di Langkah 1. Untuk pemeriksaan kedua, kita perlu menentukan alamat email pengguna sehingga kita dapat membandingkannya dengan alamat email yang mereka masukkan ke dalam kontrol TextBox. Untuk mendapatkan informasi tentang pengguna tertentu, gunakan Membership
metode kelas GetUser
.
Metode GetUser
ini memiliki sejumlah kelebihan beban. Jika digunakan tanpa meneruskan parameter apa pun, ia mengembalikan informasi tentang pengguna yang saat ini masuk. Untuk mendapatkan informasi tentang pengguna tertentu, hubungi GetUser
yang meneruskan nama pengguna mereka. Bagaimanapun, GetUser
mengembalikan MembershipUser
objek, yang memiliki properti seperti UserName
, , Email
IsApproved
, IsOnline
, dan sebagainya.
Kode berikut mengimplementasikan dua pemeriksaan ini. Jika keduanya lulus, maka e.Authenticate
diatur ke True
, jika tidak, maka akan ditetapkan False
.
Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate
' Get the email address entered
Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)
Dim email As String = EmailTextBox.Text.Trim()
' Verify that the username/password pair is valid
If Membership.ValidateUser(myLogin.UserName, myLogin.Password) Then
' Username/password are valid, check email
Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)
If usrInfo IsNot Nothing AndAlso String.Compare(usrInfo.Email, email, True) = 0 Then
' Email matches, the credentials are valid
e.Authenticated = True
Else
' Email address is invalid...
e.Authenticated = False
End If
Else
' Username/password are not valid...
e.Authenticated = False
End If
End Sub
Dengan kode ini di tempat, coba masuk sebagai pengguna yang valid, memasukkan nama pengguna, kata sandi, dan alamat email yang benar. Coba lagi, tetapi kali ini dengan sengaja menggunakan alamat email yang salah (lihat Gambar 10). Terakhir, coba untuk ketiga kalinya menggunakan nama pengguna yang tidak ada. Dalam kasus pertama Anda harus berhasil masuk ke situs, tetapi dalam dua kasus terakhir Anda akan melihat pesan kredensial kontrol Masuk yang tidak valid.
Gambar 10: Tito Tidak Dapat Masuk Saat Menyediakan Alamat Email yang Salah (Klik untuk melihat gambar ukuran penuh)
Catatan
Seperti yang dibahas di bagian Bagaimana Kerangka Kerja Keanggotaan Menangani Upaya Masuk yang Tidak Valid di Langkah 1, ketika Membership.ValidateUser
metode dipanggil dan melewati kredensial yang tidak valid, kerangka kerja keanggotaan melacak upaya masuk yang tidak valid dan mengunci pengguna jika mereka melebihi ambang tertentu dari upaya yang tidak valid dalam jendela waktu tertentu. Karena logika autentikasi kustom kami memanggil ValidateUser
metode , kata sandi yang salah untuk nama pengguna yang valid akan menaikkan penghitung upaya masuk yang tidak valid, tetapi penghitung ini tidak ditambahkan dalam kasus di mana nama pengguna dan kata sandi valid, tetapi alamat email salah. Kemungkinannya adalah, perilaku ini cocok, karena tidak mungkin peretas akan mengetahui nama pengguna dan kata sandi, tetapi harus menggunakan teknik brute force untuk menentukan alamat email pengguna.
Langkah 4: Meningkatkan Pesan Kredensial Tidak Valid Kontrol Masuk
Ketika pengguna mencoba masuk dengan kredensial yang tidak valid, kontrol Masuk menampilkan pesan yang menjelaskan bahwa upaya masuk tidak berhasil. Secara khusus, kontrol menampilkan pesan yang ditentukan oleh propertinyaFailureText
, yang memiliki nilai default upaya masuk Anda tidak berhasil. Harap coba lagi.
Ingat bahwa ada banyak alasan mengapa kredensial pengguna mungkin tidak valid:
- Nama pengguna mungkin tidak ada
- Nama pengguna ada, tetapi kata sandi tidak valid
- Nama pengguna dan kata sandi valid, tetapi pengguna belum disetujui
- Nama pengguna dan kata sandi valid, tetapi pengguna dikunci (kemungkinan besar karena mereka melebihi jumlah upaya masuk yang tidak valid dalam jangka waktu yang ditentukan)
Dan mungkin ada alasan lain saat menggunakan logika autentikasi kustom. Misalnya, dengan kode yang kami tulis di Langkah 3, nama pengguna dan kata sandi mungkin valid, tetapi alamat email mungkin salah.
Terlepas dari mengapa kredensial tidak valid, kontrol Masuk menampilkan pesan kesalahan yang sama. Kurangnya umpan balik ini dapat membingungkan bagi pengguna yang akunnya belum disetujui atau yang telah dikunci. Namun, dengan sedikit pekerjaan, kita dapat memiliki kontrol Login menampilkan pesan yang lebih tepat.
Setiap kali pengguna mencoba masuk dengan kredensial yang tidak valid, kontrol Login akan memunculkan peristiwanya LoginError
. Lanjutkan dan buat penanganan aktivitas untuk peristiwa ini, dan tambahkan kode berikut:
Protected Sub myLogin_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles myLogin.LoginError
' Determine why the user could not login...
myLogin.FailureText = "Your login attempt was not successful. Please try again."
' Does there exist a User account for this user?
Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)
If usrInfo IsNot Nothing Then
' Is this user locked out?
If usrInfo.IsLockedOut Then
myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked."
ElseIf Not usrInfo.IsApproved Then
myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account."
End If
End If
End Sub
Kode di atas dimulai dengan mengatur properti Kontrol FailureText
masuk ke nilai default ( Upaya masuk Anda tidak berhasil. Silakan coba lagi ). Kemudian memeriksa untuk melihat apakah nama pengguna yang disediakan memetakan ke akun pengguna yang ada. Jika demikian, konsultasikan dengan objek IsLockedOut
dan IsApproved
properti yang dihasilkan MembershipUser
untuk menentukan apakah akun telah dikunci atau belum disetujui. Dalam kedua kasus, properti diperbarui FailureText
ke nilai yang sesuai.
Untuk menguji kode ini, sengaja mencoba masuk sebagai pengguna yang sudah ada, tetapi menggunakan kata sandi yang salah. Lakukan ini lima kali berturut-turut dalam jangka waktu 10 menit dan akun akan dikunci. Seperti yang ditunjukkan Gambar 11, upaya masuk berikutnya akan selalu gagal (bahkan dengan kata sandi yang benar), tetapi sekarang akan menampilkan akun Anda yang lebih deskriptif telah dikunci karena terlalu banyak upaya masuk yang tidak valid. Silakan hubungi administrator agar akun Anda tidak terkunci pesan.
Gambar 11: Tito Melakukan Terlalu Banyak Upaya Masuk yang Tidak Valid dan Telah Dikunci (Klik untuk melihat gambar ukuran penuh)
Ringkasan
Sebelum tutorial ini, halaman masuk kami memvalidasi kredensial yang disediakan terhadap daftar pasangan nama pengguna/kata sandi yang dikodekan secara permanen. Dalam tutorial ini, kami memperbarui halaman untuk memvalidasi kredensial terhadap kerangka kerja Keanggotaan. Pada Langkah 1 kita melihat menggunakan metode secara Membership.ValidateUser
terprogram. Pada Langkah 2 kami mengganti antarmuka pengguna dan kode yang dibuat secara manual dengan kontrol Login.
Kontrol Login merender antarmuka pengguna masuk standar dan secara otomatis memvalidasi kredensial pengguna terhadap kerangka kerja Keanggotaan. Selain itu, jika terjadi kredensial yang valid, kontrol Masuk memasukkan pengguna melalui autentikasi formulir. Singkatnya, pengalaman pengguna masuk yang berfungsi penuh tersedia hanya dengan menyeret kontrol Login ke halaman, tidak ada markup atau kode deklaratif tambahan yang diperlukan. Terlebih lagi, kontrol Login sangat dapat disesuaikan, memungkinkan tingkat kontrol yang baik atas antarmuka pengguna yang dirender dan logika autentikasi.
Pada titik ini pengunjung situs web kami dapat membuat akun pengguna baru dan masuk ke situs, tetapi kami belum melihat pembatasan akses ke halaman berdasarkan pengguna yang diautentikasi. Saat ini, setiap pengguna, terautentikasi atau anonim, dapat melihat halaman apa pun di situs kami. Seiring dengan mengontrol akses ke halaman situs kami berdasarkan pengguna demi pengguna, kami mungkin memiliki halaman tertentu yang fungsionalitasnya bergantung pada pengguna. Tutorial berikutnya melihat cara membatasi akses dan fungsionalitas dalam halaman berdasarkan pengguna yang masuk.
Selamat Pemrograman!
Bacaan lebih lanjut
Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:
- Menampilkan Pesan Kustom ke Pengguna yang Dikunci dan Tidak Disetujui
- Memeriksa Keanggotaan, Peran, dan Profil ASP.NET 2.0
- Cara: Membuat Halaman Masuk ASP.NET
- Dokumentasi Teknis Kontrol Masuk
- Menggunakan Kontrol Masuk
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 independen, pelatih, dan penulis. 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 Kepada
Seri tutorial ini ditinjau oleh banyak peninjau yang membantu. Peninjau utama untuk tutorial ini adalah Teresa Murphy dan Michael Olivero. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, jatuhkan saya baris di mitchell@4GuysFromRolla.com.