Bagikan melalui


Memvalidasi Kredensial Pengguna Terhadap Penyimpanan Pengguna Keanggotaan (C#)

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).

Antarmuka Halaman Masuk Mencakup Dua Kotak Teks, Daftar Kotak Centang, dan Tombol

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 void LoginButton_Click(object sender, EventArgs e)
{
    // Validate the user against the Membership framework user store
    if (Membership.ValidateUser(UserName.Text, Password.Text))
    {
        // Log the user into the site
        FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
    }
    // If we reach here, the user's credentials were invalid
    InvalidCredentialsMessage.Visible = true;
}

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.

Komentari Markup Deklaratif dan Kode Sumber yang Ada di Login.aspx

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.

Menambahkan Kontrol Masuk ke Halaman

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 Login menggunakan empat faktor untuk menentukan halaman yang sesuai untuk mengalihkan pengguna ke saat berhasil masuk:

  • Apakah kontrol Login ada di halaman masuk seperti yang ditentukan oleh loginUrl pengaturan dalam konfigurasi autentikasi formulir; nilai default pengaturan ini adalah Login.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.

Kontrol Login menggunakan empat parameter 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 luangkan beberapa saat untuk mempercepat penampilan kontrol Login kita. Login.aspx Karena halaman sudah memiliki teks di bagian atas halaman yang bertuliskan Login, judul kontrol Login sangat 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 masing-masing dapat disesuaikan melalui UserNameLabelText properti dan PasswordLabelText. Mari kita ubah Nama Pengguna: Label untuk membaca Nama Pengguna:. Gaya Label dan TextBox masing-masing dapat dikonfigurasi LabelStyle melalui properti danTextBoxStyle .

Properti Ingat saya lain kali Teks Kotak Centang dapat diatur melalui kontrol RememberMeText propertyMasuk , dan status pemeriksaan defaultnya dapat dikonfigurasi melalui RememberMeSet property (yang default ke False). Lanjutkan dan atur RememberMeSet properti ke True sehingga Kotak Centang Ingat saya lain kali akan dicentang secara default.

Kontrol Login menawarkan dua properti untuk menyesuaikan tata letak kontrol antarmuka penggunanya. TextLayout property menunjukkan apakah Nama Pengguna: dan Kata Sandi: Label muncul di sebelah kiri Kotak Teks terkait (default), atau di atasnya. Orientation property 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 dalam tutorial sebelumnya. Kontrol HelpPageText login dan HelpPageUrl properti dan propertiPasswordRecoveryUrlPasswordRecoveryText 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.

Nilai Properti Kontrol Masuk Menentukan Tampilannya

Gambar 5: Nilai Properti Kontrol Masuk Menentukan Tampilannya (Klik untuk melihat gambar ukuran penuh)

Mengonfigurasi Tata Letak Kontrol Masuk

Antarmuka pengguna default kontrol Web Login menjabarkan antarmuka dalam HTML <table>. Tetapi bagaimana jika kita membutuhkan kontrol yang lebih baik atas output yang dirender? Mungkin kita ingin mengganti <table> dengan 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:

  1. Perbarui antarmuka kontrol Login untuk menyertakan kontrol Web untuk mengumpulkan kredensial tambahan.
  2. Ambil alih logika autentikasi internal kontrol Login 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. Sedangkan untuk tugas kedua, logika autentikasi Kontrol login dapat digantikan dengan membuat penanganan aktivitas untuk peristiwa kontrolAuthenticate.

Mari kita perbarui kontrol Login sehingga meminta pengguna untuk 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 Cerdas kontrol Masuk, pilih opsi Konversi ke templat.

Mengonversi Kontrol Masuk menjadi 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 Pintar 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.

Lebih Sedikit Properti yang Tersedia Saat Kontrol Masuk Dikonversi ke 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 TextBox, kunjungi halaman melalui browser. Seperti yang ditunjukkan Gambar 8, antarmuka pengguna kontrol Login sekarang menyertakan kotak teks ketiga.

Kontrol Masuk Sekarang Menyertakan Kotak Teks untuk Alamat Email Pengguna

Gambar 8: Kontrol Masuk Sekarang Menyertakan Kotak Teks untuk Alamat Email Pengguna (Klik untuk melihat gambar ukuran penuh)

Pada titik ini, kontrol Login masih menggunakan Membership.ValidateUser metode untuk memvalidasi kredensial yang disediakan. Secara terkait, nilai yang dimasukkan ke dalam Email TextBox tidak memiliki bantalan 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 mengeklik tombol Masuk, postback melanjutkan dan kontrol Login 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.Canceltrue.

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 Login 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 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 masuk yang menambahkan parameter loginfailure=1 querystring (yang menyebabkan kontrol Login menampilkan pesan kegagalan).

Gambar 9 menawarkan bagan alur alur kerja autentikasi.

Alur Kerja Autentikasi Kontrol Masuk

Gambar 9: Alur Kerja Autentikasi Kontrol Masuk (Klik untuk melihat gambar ukuran penuh)

Catatan

Jika Anda bertanya-tanya kapan Anda akan menggunakan FailureActionopsi 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.

AuthenticateMembuat Penanganan Aktivitas

Untuk menyambungkan logika autentikasi kustom, kita perlu membuat penanganan aktivitas untuk peristiwa kontrol Authenticate Login. Membuat penanganan aktivitas untuk Authenticate peristiwa akan menghasilkan definisi penanganan aktivitas berikut:

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
}

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 kami, kemudian, adalah menulis kode di sini yang menentukan apakah kredensial yang diberikan 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 Kotak Teks 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:

TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;

Untuk memvalidasi kredensial pengguna, kita perlu melakukan dua hal:

  1. Pastikan bahwa nama pengguna dan kata sandi yang disediakan valid
  2. Pastikan 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, parameter tersebut mengembalikan informasi tentang pengguna yang saat ini masuk. Untuk mendapatkan informasi tentang pengguna tertentu, panggil GetUser meneruskan nama pengguna mereka. Bagaimanapun, GetUser mengembalikan MembershipUser objek, yang memiliki properti seperti UserName, , EmailIsApproved, 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 void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
    // Get the email address entered
    TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;
    string email = EmailTextBox.Text.Trim();

    // Verify that the username/password pair is valid
    if (Membership.ValidateUser(myLogin.UserName, myLogin.Password))
    {
        // Username/password are valid, check email
        MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
        if (usrInfo != null && string.Compare(usrInfo.Email, email, true) == 0)
        {
            // Email matches, the credentials are valid
            e.Authenticated = true;
        }
        else
        {
            // Email address is invalid...
            e.Authenticated = false;
        }
    }
    else
    {
        // Username/password are not valid...
        e.Authenticated = false;
    }
}

Dengan kode ini di tempat, coba masuk sebagai pengguna yang valid, masukkan 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 tidak valid kontrol Masuk.

Tito Tidak Dapat Masuk Saat Menyediakan Alamat Email yang Salah

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 yang ditentukan. Karena logika autentikasi kustom kami memanggil metode , ValidateUser 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 menaikkan peristiwanya LoginError . Lanjutkan dan buat penanganan aktivitas untuk kejadian ini, dan tambahkan kode berikut:

protected void myLogin_LoginError(object sender, EventArgs e)
{
    // 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?
    MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
    if (usrInfo != null)
    {
        // Is this user locked out?
        if (usrInfo.IsLockedOut)
        {
            myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked.";
        }
        else if (!usrInfo.IsApproved)
        {
            myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account.";
        }
    }
}

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 MembershipUser dihasilkan 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 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.

Tito Melakukan Terlalu Banyak Upaya Masuk yang Tidak Valid dan Telah Dikunci

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 Masuk 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 membatasi 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:

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 kepada

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Teresa Murphy dan Michael Olivero. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, letakkan saya baris di mitchell@4GuysFromRolla.com.