Bagikan melalui


Dasar-Dasar Keamanan dan Dukungan ASP.NET (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 PDF

Ini adalah tutorial pertama dalam serangkaian tutorial yang akan mengeksplorasi teknik untuk mengautentikasi pengunjung melalui formulir web, mengotorisasi akses ke halaman dan fungsionalitas tertentu, dan mengelola akun pengguna dalam aplikasi ASP.NET.

Pengantar

Apa satu hal forum, situs eCommerce, situs email online, situs web portal, dan situs jejaring sosial semuanya memiliki kesamaan? Mereka semua menawarkan akun pengguna. Situs yang menawarkan akun pengguna harus menyediakan sejumlah layanan. Minimal, pengunjung baru harus dapat membuat akun dan pengunjung yang kembali harus dapat masuk. Aplikasi web tersebut dapat membuat keputusan berdasarkan pengguna yang masuk: beberapa halaman atau tindakan mungkin dibatasi hanya untuk pengguna yang masuk, atau ke subset pengguna tertentu; halaman lain mungkin menampilkan informasi khusus untuk pengguna yang masuk, atau mungkin menampilkan lebih banyak atau lebih sedikit informasi, tergantung pada pengguna apa yang melihat halaman.

Ini adalah tutorial pertama dalam serangkaian tutorial yang akan mengeksplorasi teknik untuk mengautentikasi pengunjung melalui formulir web, mengotorisasi akses ke halaman dan fungsionalitas tertentu, dan mengelola akun pengguna dalam aplikasi ASP.NET. Selama tutorial ini kita akan memeriksa cara:

  • Mengidentifikasi dan mencatat pengguna ke situs web
  • Gunakan ASP. Kerangka kerja Keanggotaan NET untuk mengelola akun pengguna
  • Membuat, memperbarui, dan menghapus akun pengguna
  • Membatasi akses ke halaman web, direktori, atau fungsionalitas tertentu berdasarkan pengguna yang masuk
  • Gunakan ASP. Kerangka kerja Peran NET untuk mengaitkan akun pengguna dengan peran
  • Mengelola peran pengguna
  • Membatasi akses ke halaman web, direktori, atau fungsionalitas tertentu berdasarkan peran pengguna yang masuk
  • Sesuaikan dan perluas ASP. Kontrol Web keamanan NET

Tutorial ini diarahkan untuk ringkas dan memberikan instruksi langkah demi langkah dengan banyak cuplikan layar untuk memandu Anda melalui proses secara visual. Setiap tutorial tersedia dalam versi C# dan Visual Basic dan menyertakan unduhan kode lengkap yang digunakan. (Tutorial pertama ini berfokus pada konsep keamanan dari sudut pandang tingkat tinggi dan karenanya tidak berisi kode terkait.)

Dalam tutorial ini kita akan membahas konsep keamanan penting dan fasilitas apa yang tersedia dalam ASP.NET untuk membantu menerapkan autentikasi formulir, otorisasi, akun pengguna, dan peran. Mari kita mulai!

Catatan

Keamanan adalah aspek penting dari setiap aplikasi yang mencakup keputusan fisik, teknologi, dan kebijakan dan membutuhkan tingkat perencanaan dan pengetahuan domain yang tinggi. Seri tutorial ini tidak dimaksudkan sebagai panduan untuk mengembangkan aplikasi web yang aman. Sebaliknya, ini berfokus secara khusus pada autentikasi formulir, otorisasi, akun pengguna, dan peran. Sementara beberapa konsep keamanan yang berputar di sekitar masalah ini dibahas dalam seri ini, yang lain dibiarkan tidak dijelajahi.

Autentikasi, Otorisasi, Akun Pengguna, dan Peran

Autentikasi, otorisasi, akun pengguna, dan peran adalah empat istilah yang akan sangat sering digunakan di seluruh seri tutorial ini, jadi saya ingin mengambil waktu sejenak untuk menentukan istilah-istilah ini dalam konteks keamanan web. Dalam model server klien, seperti Internet, ada banyak skenario di mana server perlu mengidentifikasi klien yang membuat permintaan. Autentikasi adalah proses untuk memastikan identitas klien. Klien yang telah berhasil diidentifikasi dikatakan diautentikasi. Klien yang tidak teridentifikasi dikatakan tidak terauthentikasi atau anonim.

Sistem autentikasi yang aman melibatkan setidaknya salah satu dari tiga faset berikut: sesuatu yang Anda ketahui, sesuatu yang Anda miliki, atau sesuatu yang Anda miliki. Sebagian besar aplikasi web mengandalkan sesuatu yang diketahui klien, seperti kata sandi atau PIN. Informasi yang digunakan untuk mengidentifikasi pengguna - nama pengguna dan kata sandinya, misalnya - disebut sebagai kredensial. Seri tutorial ini berfokus pada autentikasi formulir, yang merupakan model autentikasi tempat pengguna masuk ke situs dengan memberikan kredensial mereka dalam formulir halaman web. Kita semua pernah mengalami jenis autentikasi ini sebelumnya. Buka situs eCommerce apa pun. Ketika Anda siap untuk memeriksa, Anda diminta untuk masuk dengan memasukkan nama pengguna dan kata sandi Anda ke dalam kotak teks di halaman web.

Selain mengidentifikasi klien, server mungkin perlu membatasi sumber daya atau fungsionalitas apa yang dapat diakses tergantung pada klien yang membuat permintaan. Otorisasi adalah proses menentukan apakah pengguna tertentu memiliki otoritas untuk mengakses sumber daya atau fungsionalitas tertentu.

Akun pengguna adalah penyimpanan untuk menyimpan informasi tentang pengguna tertentu. Akun pengguna harus minimal menyertakan informasi yang secara unik mengidentifikasi pengguna, seperti nama login dan kata sandi pengguna. Seiring dengan informasi penting ini, akun pengguna dapat mencakup hal-hal seperti: alamat email pengguna; tanggal dan waktu akun dibuat; tanggal dan waktu terakhir kali mereka masuk; nama depan dan belakang; nomor telepon; dan alamat surat. Saat menggunakan autentikasi formulir, informasi akun pengguna biasanya disimpan dalam database relasional seperti Microsoft SQL Server.

Aplikasi web yang mendukung akun pengguna dapat secara opsional mengelompokkan pengguna ke dalam peran. Peran hanyalah label yang diterapkan kepada pengguna dan menyediakan abstraksi untuk menentukan aturan otorisasi dan fungsionalitas tingkat halaman. Misalnya, situs web mungkin menyertakan peran Administrator dengan aturan otorisasi yang melarang siapa pun kecuali Administrator untuk mengakses sekumpulan halaman web tertentu. Selain itu, berbagai halaman yang dapat diakses oleh semua pengguna (termasuk non-Administrator) mungkin menampilkan data tambahan atau menawarkan fungsionalitas tambahan saat dikunjungi oleh pengguna dalam peran Administrator. Dengan menggunakan peran, kita dapat menentukan aturan otorisasi ini berdasarkan peran demi peran daripada pengguna demi pengguna.

Mengautentikasi Pengguna dalam Aplikasi ASP.NET

Saat pengguna memasukkan URL ke jendela alamat browser mereka atau mengklik tautan, browser membuat permintaan Hypertext Transfer Protocol (HTTP) ke server web untuk konten yang ditentukan, baik itu halaman ASP.NET, gambar, file JavaScript, atau jenis konten lainnya. Server web ditugaskan untuk mengembalikan konten yang diminta. Dalam melakukannya, itu harus menentukan sejumlah hal tentang permintaan, termasuk siapa yang membuat permintaan dan apakah identitas berwenang untuk mengambil konten yang diminta.

Secara default, browser mengirim permintaan HTTP yang tidak memiliki segala jenis informasi identifikasi. Tetapi jika browser menyertakan informasi autentikasi, maka server web memulai alur kerja autentikasi, yang mencoba mengidentifikasi klien yang membuat permintaan. Langkah-langkah alur kerja autentikasi bergantung pada jenis autentikasi yang digunakan oleh aplikasi web. ASP.NET mendukung tiga jenis autentikasi: Windows, Paspor, dan formulir. Seri tutorial ini berfokus pada autentikasi formulir, tetapi mari kita luangkan waktu satu menit untuk membandingkan dan membedakan penyimpanan dan alur kerja pengguna autentikasi Windows.

Autentikasi melalui Autentikasi Windows

Alur kerja autentikasi Windows menggunakan salah satu teknik autentikasi berikut:

  • Autentikasi dasar
  • Autentikasi digest
  • Windows Integrated Authentication

Ketiga teknik bekerja dengan cara yang kira-kira sama: ketika permintaan anonim yang tidak sah tiba, server web mengirim kembali respons HTTP yang menunjukkan bahwa otorisasi diperlukan untuk melanjutkan. Browser kemudian menampilkan kotak dialog modal yang meminta nama pengguna dan kata sandi mereka (lihat Gambar 1). Informasi ini kemudian dikirim kembali ke server web melalui header HTTP.

Kotak Dialog Modal Meminta Pengguna untuk Kredensialnya

Gambar 1: Kotak Dialog Modal Meminta KredensialNya kepada Pengguna

Kredensial yang disediakan divalidasi terhadap Windows User Store server web. Ini berarti bahwa setiap pengguna yang diautentikasi di aplikasi web Anda harus memiliki akun Windows di organisasi Anda. Ini adalah hal yang biasa dalam skenario intranet. Bahkan, saat menggunakan Autentikasi Terintegrasi Windows dalam pengaturan intranet, browser secara otomatis menyediakan server web dengan kredensial yang digunakan untuk masuk ke jaringan, sehingga menekan kotak dialog yang ditampilkan di Gambar 1. Meskipun autentikasi Windows sangat bagus untuk aplikasi intranet, biasanya tidak layak untuk aplikasi Internet karena Anda tidak ingin membuat akun Windows untuk setiap pengguna yang mendaftar di situs Anda.

Autentikasi melalui Autentikasi Formulir

Autentikasi formulir, di sisi lain, sangat ideal untuk aplikasi web Internet. Ingat bahwa autentikasi formulir mengidentifikasi pengguna dengan meminta mereka untuk memasukkan kredensial mereka melalui formulir web. Akibatnya, ketika pengguna mencoba mengakses sumber daya yang tidak sah, mereka secara otomatis diarahkan ke halaman masuk tempat mereka dapat memasukkan kredensial mereka. Kredensial yang dikirimkan kemudian divalidasi terhadap penyimpanan pengguna kustom - biasanya database.

Setelah memverifikasi kredensial yang dikirimkan, tiket autentikasi formulir dibuat untuk pengguna. Tiket ini menunjukkan bahwa pengguna telah diautentikasi dan menyertakan informasi identifikasi, seperti nama pengguna. Tiket autentikasi formulir (biasanya) disimpan sebagai cookie di komputer klien. Oleh karena itu, kunjungan berikutnya ke situs web mencakup tiket autentikasi formulir dalam permintaan HTTP, sehingga memungkinkan aplikasi web untuk mengidentifikasi pengguna setelah mereka masuk.

Gambar 2 mengilustrasikan alur kerja autentikasi formulir dari titik vantase tingkat tinggi. Perhatikan bagaimana potongan autentikasi dan otorisasi dalam ASP.NET bertindak sebagai dua entitas terpisah. Sistem autentikasi formulir mengidentifikasi pengguna (atau melaporkan bahwa mereka anonim). Sistem otorisasi adalah yang menentukan apakah pengguna memiliki akses ke sumber daya yang diminta. Jika pengguna tidak sah (seperti yang ada di Gambar 2 saat mencoba mengunjungi ProtectedPage.aspx secara anonim), sistem otorisasi melaporkan bahwa pengguna ditolak, menyebabkan sistem autentikasi formulir secara otomatis mengarahkan pengguna ke halaman login.

Setelah pengguna berhasil masuk, permintaan HTTP berikutnya menyertakan tiket autentikasi formulir. Sistem autentikasi formulir hanya mengidentifikasi pengguna - ini adalah sistem otorisasi yang menentukan apakah pengguna dapat mengakses sumber daya yang diminta.

Alur Kerja Autentikasi Formulir

Gambar 2: Alur Kerja Autentikasi Formulir

Kami akan menggali autentikasi formulir dalam detail yang jauh lebih besar dalam tutorial berikutnya, Gambaran Umum Autentikasi Formulir. Untuk informasi selengkapnya tentang ASP. Opsi autentikasi NET, lihat Autentikasi ASP.NET.

Membatasi Akses ke Halaman Web, Direktori, dan Fungsionalitas Halaman

ASP.NET mencakup dua cara untuk menentukan apakah pengguna tertentu memiliki otoritas untuk mengakses file atau direktori tertentu:

  • Otorisasi file - karena halaman ASP.NET dan layanan web diimplementasikan sebagai file yang berada di sistem file server web, akses ke file-file ini dapat ditentukan melalui Access Control Lists (ACL). Otorisasi file paling umum digunakan dengan autentikasi Windows karena ACL adalah izin yang berlaku untuk akun Windows. Saat menggunakan autentikasi formulir, semua permintaan tingkat sistem operasi dan sistem file dijalankan oleh akun Windows yang sama, terlepas dari pengguna yang mengunjungi situs.
  • Otorisasi URL- dengan otorisasi URL, pengembang halaman menentukan aturan otorisasi dalam Web.config. Aturan otorisasi ini menentukan pengguna atau peran apa yang diizinkan untuk mengakses atau ditolak untuk mengakses halaman atau direktori tertentu dalam aplikasi.

Otorisasi file dan otorisasi URL menentukan aturan otorisasi untuk mengakses halaman ASP.NET tertentu atau untuk semua halaman ASP.NET dalam direktori tertentu. Dengan menggunakan teknik ini, kami dapat menginstruksikan ASP.NET untuk menolak permintaan ke halaman tertentu untuk pengguna tertentu, atau mengizinkan akses ke sekumpulan pengguna dan menolak akses ke orang lain. Bagaimana dengan skenario di mana semua pengguna dapat mengakses halaman, tetapi fungsionalitas halaman bergantung pada pengguna? Misalnya, banyak situs yang mendukung akun pengguna memiliki halaman yang menampilkan konten atau data yang berbeda untuk pengguna terautentikasi versus pengguna anonim. Pengguna anonim mungkin melihat tautan untuk masuk ke situs, sedangkan pengguna yang diautentikasi akan melihat pesan seperti, Selamat Datang kembali, Nama Pengguna bersama dengan tautan untuk keluar. Contoh lain: saat melihat item di situs lelang, Anda melihat informasi yang berbeda tergantung pada apakah Anda adalah penagih atau yang melelang item.

Penyesuaian tingkat halaman tersebut dapat dicapai secara deklaratif atau terprogram. Untuk menampilkan konten yang berbeda untuk pengguna anonim daripada pengguna yang diautentikasi, cukup seret kontrol LoginView ke halaman Anda dan masukkan konten yang sesuai ke dalam templat AnonymousTemplate dan LoggedInTemplate-nya. Atau, Anda dapat secara terprogram menentukan apakah permintaan saat ini diautentikasi, siapa penggunanya, dan peran apa yang mereka milik (jika ada). Anda dapat menggunakan informasi ini untuk menampilkan atau menyembunyikan kolom dalam kisi atau Panel pada halaman.

Seri ini mencakup tiga tutorial yang berfokus pada otorisasi. Otorisasi Berbasis Penggunamemeriksa cara membatasi akses ke halaman atau halaman di direktori untuk akun pengguna tertentu; Otorisasi Berbasis Peran melihat penyediaan aturan otorisasi di tingkat peran; terakhir, tutorial Menampilkan Konten Berdasarkan Pengguna yang Saat Ini Masuk mengeksplorasi memodifikasi konten dan fungsionalitas halaman tertentu berdasarkan pengguna yang mengunjungi halaman. Untuk informasi selengkapnya tentang ASP. Opsi otorisasi NET, lihat Otorisasi ASP.NET.

Akun dan Peran Pengguna

ASP. Autentikasi formulir NET menyediakan infrastruktur bagi pengguna untuk masuk ke situs dan status terautentikasi mereka diingat di seluruh kunjungan halaman. Otorisasi URL menawarkan kerangka kerja untuk membatasi akses ke file atau folder tertentu dalam aplikasi ASP.NET. Namun, tidak ada fitur yang menyediakan sarana untuk menyimpan informasi akun pengguna atau mengelola peran.

Sebelum ASP.NET 2.0, pengembang bertanggung jawab untuk membuat pengguna dan penyimpanan peran mereka sendiri. Mereka juga berada di kait untuk merancang antarmuka pengguna dan menulis kode untuk halaman terkait akun pengguna penting seperti halaman login dan halaman untuk membuat akun baru, antara lain. Tanpa kerangka kerja akun pengguna bawaan dalam ASP.NET, setiap pengembang yang menerapkan akun pengguna harus sampai pada keputusan desainnya sendiri tentang pertanyaan seperti, Bagaimana cara menyimpan kata sandi atau informasi sensitif lainnya? dan Panduan apa yang harus saya terpakai mengenai panjang dan kekuatan kata sandi?

Saat ini, menerapkan akun pengguna dalam aplikasi ASP.NET jauh lebih sederhana berkat kerangka kerja Keanggotaan dan kontrol Web Masuk bawaan. Kerangka kerja Keanggotaan adalah beberapa kelas di namespace System.Web.Security yang menyediakan fungsionalitas untuk melakukan tugas terkait akun pengguna penting. Kelas kunci dalam kerangka kerja Keanggotaan adalah kelas Keanggotaan, yang memiliki metode seperti:

  • CreateUser
  • DeleteUser
  • GetAllUsers
  • GetUser
  • UpdateUser
  • ValidateUser

Kerangka kerja Keanggotaan menggunakan model penyedia, yang dengan bersih memisahkan API kerangka kerja Keanggotaan dari implementasinya. Ini memungkinkan pengembang untuk menggunakan API umum, tetapi memberdayakan mereka untuk menggunakan implementasi yang memenuhi kebutuhan kustom aplikasi mereka. Singkatnya, kelas Keanggotaan mendefinisikan fungsionalitas penting dari kerangka kerja (metode, properti, dan peristiwa), tetapi tidak benar-benar menyediakan detail implementasi apa pun. Sebaliknya, metode kelas Keanggotaan memanggil penyedia yang dikonfigurasi, yang melakukan pekerjaan aktual. Misalnya, ketika metode CreateUser kelas Keanggotaan dipanggil, kelas Keanggotaan tidak mengetahui detail penyimpanan pengguna. Tidak tahu apakah pengguna dipertahankan dalam database atau dalam file XML atau di beberapa penyimpanan lain. Kelas Keanggotaan memeriksa konfigurasi aplikasi web untuk menentukan penyedia apa yang akan mendelegasikan panggilan, dan kelas penyedia tersebut bertanggung jawab untuk benar-benar membuat akun pengguna baru di penyimpanan pengguna yang sesuai. Interaksi ini diilustrasikan dalam Gambar 3.

Microsoft mengirimkan dua kelas penyedia Keanggotaan di .NET Framework:

Seri tutorial ini berfokus secara eksklusif pada SqlMembershipProvider.

Model Penyedia Memungkinkan Implementasi yang Berbeda Dicolokkan dengan Mulus Ke Dalam Kerangka Kerja</kuat>

Gambar 03: Model Penyedia Memungkinkan Implementasi yang Berbeda Dicolokkan dengan Mulus Ke Dalam Kerangka Kerja (Klik untuk melihat gambar ukuran penuh)

Manfaat dari model penyedia adalah bahwa implementasi alternatif dapat dikembangkan oleh Microsoft, vendor pihak ketiga, atau pengembang individu dan dicolokkan dengan mulus ke dalam kerangka kerja Keanggotaan. Misalnya, Microsoft telah merilis penyedia Keanggotaan untuk database Microsoft Access. Untuk informasi selengkapnya tentang penyedia Keanggotaan, lihat Toolkit Penyedia, yang mencakup panduan penyedia Keanggotaan, penyedia kustom sampel, lebih dari 100 halaman dokumentasi tentang model penyedia, dan kode sumber lengkap untuk penyedia Keanggotaan bawaan (yaitu, ActiveDirectoryMembershipProvider dan SqlMembershipProvider).

ASP.NET 2.0 juga memperkenalkan kerangka kerja Peran. Seperti kerangka kerja Keanggotaan, kerangka kerja Peran dibangun di atas model penyedia. API-nya diekspos melalui kelas Peran dan .NET Framework dikirim dengan tiga kelas penyedia:

  • AuthorizationStoreRoleProvider - mengelola informasi peran di penyimpanan kebijakan manajer otorisasi, seperti Active Directory atau ADAM.
  • SqlRoleProvider - mengimplementasikan peran dalam database SQL Server.
  • WindowsTokenRoleProvider - mengaitkan informasi peran berdasarkan grup Windows pengunjung. Metode ini biasanya digunakan dengan autentikasi Windows.

Seri tutorial ini berfokus secara eksklusif pada SqlRoleProvider.

Karena model penyedia menyertakan satu API yang menghadap ke depan (kelas Keanggotaan dan Peran), dimungkinkan untuk membangun fungsionalitas di sekitar API tersebut tanpa harus khawatir tentang detail implementasi - yang ditangani oleh penyedia yang dipilih oleh pengembang halaman. API terpadu ini memungkinkan Microsoft dan vendor pihak ketiga untuk membangun kontrol Web yang berinteraksi dengan kerangka kerja Keanggotaan dan Peran. ASP.NET dikirim dengan sejumlah kontrol Web Login untuk menerapkan antarmuka pengguna akun pengguna umum. Misalnya, kontrol Login meminta kredensial mereka kepada pengguna, memvalidasinya, lalu memasukkannya melalui autentikasi formulir. Kontrol LoginView menawarkan templat untuk menampilkan markup yang berbeda untuk pengguna anonim versus pengguna yang diautentikasi, atau markup yang berbeda berdasarkan peran pengguna. Dan kontrol CreateUserWizard menyediakan antarmuka pengguna langkah demi langkah untuk membuat akun pengguna baru.

Di bawah mencakup berbagai kontrol Login berinteraksi dengan kerangka kerja Keanggotaan dan Peran. Sebagian besar kontrol Login dapat diimplementasikan tanpa harus menulis satu baris kode pun. Kami akan memeriksa kontrol ini secara lebih rinci dalam tutorial mendatang, termasuk teknik untuk memperluas dan menyesuaikan fungsionalitasnya.

Ringkasan

Semua aplikasi web yang mendukung akun pengguna memerlukan fitur serupa, seperti: kemampuan pengguna untuk masuk dan status masuk mereka diingat di seluruh kunjungan halaman; halaman web bagi pengunjung baru untuk membuat akun; dan kemampuan pengembang halaman untuk menentukan sumber daya, data, dan fungsionalitas apa yang tersedia untuk pengguna atau peran apa. Tugas mengautentikasi dan mengotorisasi pengguna dan mengelola akun dan peran pengguna sangat mudah dicapai dalam aplikasi ASP.NET berkat autentikasi formulir, otorisasi URL, dan kerangka kerja Keanggotaan dan Peran.

Selama beberapa tutorial berikutnya kita akan memeriksa aspek-aspek ini dengan membangun aplikasi web yang berfungsi dari bawah ke atas dengan cara langkah demi langkah. Dalam dua tutorial berikutnya kita akan menjelajahi autentikasi formulir secara rinci. Kita akan melihat alur kerja autentikasi formulir beraksi, membedah formulir tiket autentikasi, mendiskusikan masalah keamanan, dan melihat cara mengonfigurasi sistem autentikasi formulir - sekaligus membangun aplikasi web yang memungkinkan pengunjung untuk masuk dan keluar.

Selamat Pemrograman!

Bacaan lebih lanjut

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

Tentang Penulis

Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama 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. Dia dapat dijangkau di mitchell@4GuysFromRolla.com. atau melalui blognya, yang dapat ditemukan di http://ScottOnWriting.NET.

Terima Kasih Khusus Kepada

Seri tutorial ini ditinjau oleh banyak peninjau yang membantu. Peninjau prospek untuk tutorial ini adalah Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini termasuk Alicja Maziarz, John Suru, dan Teresa Murphy. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, jatuhkan saya baris di mitchell@4GuysFromRolla.com.