Ringkasan: Komponen Keanggotaan asp.net 2.0 menyediakan serangkaian antarmuka yang sangat sederhana dan mudah digunakan bagi pengembang untuk melakukan manajemen pengguna dan verifikasi pengguna. Artikel ini akan menganalisis secara singkat prinsip penerapannya, memperkenalkan cara menggunakannya dengan benar, dan cara memperluasnya.
1. Kelas abstrak MembershipProvider
Dalam banyak kasus, kami tidak menggunakan kelas ini secara langsung saat menggunakan Keanggotaan. Kelas MembershipProvider mendefinisikan beberapa metode abstrak dan atribut abstrak. Metode dan atribut inilah yang merupakan spesifikasi dasar antarmuka Keanggotaan, dan fungsi penggunaan Keanggotaan dalam kerangka .NET semuanya dipanggil melalui tipe ini. Kelas yang diwarisi menyediakan fungsi manajemen pengguna di lingkungan yang berbeda dengan mengimplementasikan antarmuka ini, dan tidak berdampak pada kerangka Membership itu sendiri. Mari kita lihat definisi prototipe MembershipProvider:
public abstract class MembershipProvider : ProviderBase
...{
// Acara
public event MembershipValidatePasswordEventHandler ValidatingPassword;
// Metode
yang dilindungi MembershipProvider();
public abstract bool ChangePassword(string nama pengguna,string oldPassword
, string newPassword)
; kata sandi, string email, string passwordQuestion, string passwordAnswer, bool isApproved, penyedia objekUserKey, status MembershipCreateStatus);
byte
virtualyang
dilindungi[] DecryptPassword(byte[] encodedPassword);
(string pass, intpasswordFormat
, string salt);
byte virtual terproteksi[] EncryptPassword(byte[] kata sandi)
; , int pageIndex, int pageSize, keluar int totalRecords);
string internal GenerateSalt();
abstrak
publik
MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, keluar int totalRecords);
jawaban);
abstrak publik MembershipUser GetUser(penyedia objekUserKey, bool
userIsOnline
)
;
virtual void yang dilindungi OnValidatingPassword(ValidatePasswordEventArgs e);
string abstrak publik ResetPassword(string nama pengguna, string jawaban)
;UnEncodePassword
(string pass, int passwordFormat)
;
abstrak publik bool ValidateUser(string nama pengguna, kata sandi string);
// Properti
string abstrak publik NamaAplikasi ...{ set }
abstrak publik bool EnablePasswordReset ...{ dapatkan; }
abstrak
publik
bool EnablePasswordRetrieval ...{ dapatkan;
abstract int MinRequiredNonAlphanumericCharacters ...{ dapatkan; }
public abstract int MinRequiredPasswordLength ...{ get; }
public abstract int PasswordAttemptWindow ...
{ dapatkan; }public
abstract MembershipPasswordFormat PasswordFormat ...{ get;
{ dapatkan; }
bool abstrak publik RequiresQuestionAndAnswer ...{ dapatkan; }
bool abstrak publik RequiresUniqueEmail ...{ dapatkan }
// Bidang
Private MembershipValidatePasswordEventHandler _EventHandler;
private const SALT_SIZE_IN_BYTES = 0x10
;
Pengubah internal adalah beberapa metode yang merupakan metode tambahan untuk kata sandi, yang digunakan untuk mengenkripsi, mendekripsi, dan memverifikasi kata sandi. Namun tampaknya ada beberapa masalah dengan desain di sini. Tampaknya agak tidak tepat untuk mendefinisikan metode ini sebagai cakupan internal. Metode ini didefinisikan di kelas dasar sehingga dapat digunakan kembali, tetapi dari sudut pandang efek, memang demikian tidak demikian, karena Anggota internal hanya diperbolehkan untuk digunakan dalam majelis ini (dalam keadaan normal, metode lain seperti refleksi tidak disertakan), yang berarti Penyedia Keanggotaan kami yang diperluas tidak dapat menggunakan metode ini. Dan dilihat dari cakupan aplikasi saat ini, metode ini saat ini hanya digunakan di SqlMembershipProvider, jadi menurut saya pengubah metode ini harus diubah menjadi terlindungi.
2. Kelas statis keanggotaan
Seperti disebutkan di atas, dalam keadaan normal kita tidak akan langsung menggunakan abstraksi MembershipProvider, karena ini melibatkan masalah bagaimana membuat instance kelas layanan Keanggotaan yang sebenarnya, dan umumnya melibatkan konfigurasi dan pembuatan instance objek pertanyaan sulit, dan bagi pemula, tidak mudah untuk dikuasai. Dalam kerangka .NET, lapisan hubungan kompleks ini dilindungi melalui Keanggotaan kelas statis (Kelas Statis). Selain melindungi pengguna dari membaca file konfigurasi, objek awal, dan tugas dasar lainnya, Keanggotaan (Kelas Statis) juga memainkan peran penting dalam memuat ulang semua Penyedia Keanggotaan, jadi ada API Untuk membuatnya lebih nyaman bagi pengguna untuk menggunakan, Keanggotaan (Kelas Statis) juga memuat ulang metode ini. Dimuat sebagai metode statis, dan menyediakan implementasi kelebihan beban yang lebih kaya berdasarkan API dasar MembershipProvider untuk dipanggil oleh pengguna. Ini secara langsung mendukung baik itu di lapisan UI atau proyek lainnya, cukup merujuk ke namespace System.Web.Security, dan Anda dapat menikmati berbagai kemudahan yang disediakan oleh Keanggotaan tanpa mengkhawatirkan detail apa pun. Mari kita lihat definisi prototipe Keanggotaan (Kelas Statis): (Gunakan Reflektor .NET Lutz Roder untuk melihat semua implementasinya.)
public static class Membership
...{
// Events
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
//
Metode
Keanggotaan statis (
)
;
passwordQuestion, string passwordAnswer, bool isApproved, keluar status MembershipCreateStatus
)
;
bool statis publik DeleteUser(stringnama pengguna
, bool deleteAllRelatedData);
MembershipUserCollection FindUsersByEmail statis publik(string emailToMatch);
MembershipUserCollection FindUsersByEmail statis publik(string emailToMatch, int pageIndex, int pageSize, out int totalRecords);
MembershipUserCollection FindUsersByName(string usernameToMatch;
,
keluar int totalRecords);string statis pribadi GetCurrentUserName();
int statis publik GetNumberOfUsersOnline(
);
MembershipUser
GetUser
();
GetUser( string nama pengguna);
MembershipUser statis publik GetUser(penyedia objekUserKey, bool userIsOnline);
MembershipUserstatis publik
GetUser(string nama pengguna, bool userIsOnline
publicstatic
void UpdateUser (Pengguna MembershipUser);
bool statis publik ValidateUser (string nama pengguna, kata sandi string);
// Properti
string statis publik Nama Aplikasi ...{ setel;
bool statis publik EnablePasswordReset ...{ dapatkan; }
bool statis publik EnablePasswordRetrieval ...{
dapatkan
;
static bool IsHashAlgorithmFromMembershipConfig ...{ dapatkan; }
public static int MaxInvalidPasswordAttempts ...{ get; }
publicstatic int MinRequiredNonAlphanumericCharacters ...{ dapatkan; }
public
static int MinRequiredPasswordLength ...{ dapatkan;
{ dapatkan; }
string statis publik PasswordStrengthRegularExpression ...{ dapatkan; }
PenyediaMembershipProvider statis publik
...{ dapatkan; } Penyedia MembershipProviderCollection
statispublik
...{ dapatkan;
int UserIsOnlineTimeWindow ...{ dapatkan }
// Bidang
private static char[] tanda baca;
private static bool s_HashAlgorithmFromConfig;
private private static string s_HashAlgorithmType;
private
static
bool
s_Initialized
;
IsOnlineTimeWindow;
}
Karena itu, saya harus mengatakan beberapa patah kata. Dalam proses melihat kode implementasi Keanggotaan (Kelas Statis), Anda dapat menemukan bahwa setiap kelebihan API Membersip akhirnya memanggil metode Penyedia atribut. Tipe atribut ini adalah tipe MembershipProvider mungkin mengerti Mari kita pahami peran penting MembershipProvider. Ada juga atribut Penyedia, yaitu untuk mendapatkan semua kelas layanan Keanggotaan yang dikonfigurasi di web.config. Semuanya merupakan properti statis, namun bagaimana cara penerapannya? Dengan memanggil metode Membership.Initialize(), setiap kali kedua properti ini dipanggil, metode ini akan dipanggil untuk menentukan apakah kelas layanan yang disediakan oleh Membership telah diinisialisasi. Jika belum, kelas layanan konfigurasi akan dipanggil untuk membaca konfigurasi .konten yang akan diinisialisasi. Pada titik ini mungkin tidak sulit bagi Anda untuk memahami mengapa kami begitu mudah menggunakannya!
3. Pengenalan dan konfigurasi penggunaan SqlMembershipProvider
OK. Melalui pengenalan di atas, pada dasarnya Anda seharusnya dapat memahami struktur Keanggotaan secara keseluruhan, bukan? (Jika belum, mungkin Anda belum membuka .NET Reflector Lutz Roder untuk menganalisis kode implementasinya, atau Anda belum memahami peran kelas abstrak). Apa pun yang terjadi, tujuan utama kami adalah mempelajari cara menggunakannya.
Sebelum itu, pertama-tama saya ingin memperkenalkan dua kelas implementasi MembershipProvider yang disediakan dalam kerangka .NET: ActiveDirectoryMembershipProvider dan SqlMembershipProvider (Bagaimana Anda mengetahui kedua kelas ini? Anda dapat melihat semua kelas yang diwarisi di Jenis Turunan MembershipProvider. ) Yang pertama menyediakan pengguna dasar manajemen di bawah Active Directory (saya belum mempraktikkannya), dan yang terakhir adalah implementasi manajemen pengguna berbasis SqlServer yang paling sering kami gunakan.
Saatnya memperkenalkan cara menggunakannya. Faktanya, sudah ada artikel tentang ini di taman ((Terjemahan) Cara menggunakan Keanggotaan di ASP.NET 2.0), jadi saya tidak akan membuang-buang kata lagi. Namun di sini saya ingin memberi tahu Anda cara paling langsung untuk mempelajarinya dan menggunakannya sebagai referensi. Temukan dan buka machine.config pada disk sistem, temukan node AspNetSqlMembershipProvider, dan lihat apakah Anda dapat melihatnya. Sebenarnya, ini adalah konfigurasi Keanggotaan paling dasar, tetapi tidak memiliki spesifikasi atribut defaultProvider. Anda dapat menggunakan kontrol Login, tidak perlu menggunakan kode apa pun untuk verifikasi login pengguna. Jika Anda tidak percaya, Anda bisa mencobanya. (Untuk verifikasi Formulir, saya tidak akan memperkenalkannya di sini. Anda dapat merujuk ke informasi yang relevan. Untuk informasi lebih lanjut tentang SqlMembershipProvider, silakan merujuk ke MSDN).
4. Bagaimana cara mengkustomisasi MembershipProvider, sumber daya MembershipProvider lain yang sudah ada
Jadi, bagaimana cara kita mengkustomisasi MembershipProvider? Sebenarnya, jika Anda sudah memahami struktur Membership, saya yakin itu tidak sulit bagi Anda. Namun, mengingat masih banyak pekerjaan dan kesulitan untuk menulis MembershipProvider secara lengkap. Bagi kami, mungkin lebih banyak tempat untuk memperluas Penyedia yang ada, seperti SqlMembershipProvider. Sebenarnya, ini sangat sederhana. Kita hanya perlu mewarisi dari SqlMembershipProvider (beri tahu Anda secara diam-diam, apa yang disimpan dalam parameter konfigurasi metode Inisialisasi adalah nama atribut dan nilai dari bagian konfigurasi Penyedia yang sesuai) dan kemudian memperluas dan menulis ulang metode yang diperlukan. Saat menggunakannya, di bagian Konfigurasi penyedia, ubah nilai tipe menjadi nama kelas Anda dan semuanya akan baik-baik saja.
Terakhir, sudah ada banyak MembershipProvider di lingkungan berbeda di pasaran, seperti mysql, Oracle, dll. Berikut adalah implementasi Mysql: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp . Ada lebih banyak implementasi berbeda. Saya yakin Anda dapat menemukan bantuan lebih lanjut dari Google.
Oke, sudah terlalu banyak yang saya sampaikan, semoga dapat bermanfaat bagi anda yang telah bersusah payah membaca blog ini. Terima kasih^_*