程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0 Membership原理及應用

ASP.NET 2.0 Membership原理及應用

編輯:關於ASP.NET

摘要:asp.net 2.0的Membership組件提供了一組非常簡單易用的接口供開發者進行用戶管理,用戶驗證。本文將它對它的實現原理進行簡單的分析,介紹如何正確的使用,以及如何對它進擴展。

一、MembershipProvider抽象類

在很多情況下,在使用Membership的時候我們並不會直接使用到這個類。在MembershipProvider類定義的都是一些抽象方法和抽象屬性,就是這些方法和屬性構成了Membership接口的基本規范,而且在.NET 框架內部使用Membership的功能都是通過這個類型調用的。繼承類通過實現這些接口來提供不用環境下的用戶管理功能,並且對Membership框架本身並沒有影響,下面來看看MembershipProvider原形定義:

public abstract class MembershipProvider : ProviderBase
...{
// Events
public event MembershipValidatePasswordEventHandler ValidatingPassword;
// Methods
protected MembershipProvider();
public abstract bool ChangePassword(string username, string oldPassword, string newPassword);
public abstract bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer);
public abstract MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status);
protected virtual byte[] DecryptPassword(byte[] encodedPassword);
public abstract bool DeleteUser(string username, bool deleteAllRelatedData);
internal string EncodePassword(string pass, int passwordFormat, string salt);
protected virtual byte[] EncryptPassword(byte[] password);
public abstract MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords);
public abstract MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords);
internal string GenerateSalt();
public abstract MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords);
public abstract int GetNumberOfUsersOnline();
public abstract string GetPassword(string username, string answer);
public abstract MembershipUser GetUser(object providerUserKey, bool userIsOnline);
public abstract MembershipUser GetUser(string username, bool userIsOnline);
internal MembershipUser GetUser(string username, bool userIsOnline, bool throwOnError);
public abstract string GetUserNameByEmail(string email);
protected virtual void OnValidatingPassword(ValidatePasswordEventArgs e);
public abstract string ResetPassword(string username, string answer);
internal string UnEncodePassword(string pass, int passwordFormat);
public abstract bool UnlockUser(string userName);
public abstract void UpdateUser(MembershipUser user);
public abstract bool ValidateUser(string username, string password);
// Properties
public abstract string ApplicationName ...{ get; set; }
public abstract bool EnablePasswordReset ...{ get; }
public abstract bool EnablePasswordRetrieval ...{ get; }
public abstract int MaxInvalidPasswordAttempts ...{ get; }
public abstract int MinRequiredNonAlphanumericCharacters ...{ get; }
public abstract int MinRequiredPasswordLength ...{ get; }
public abstract int PasswordAttemptWindow ...{ get; }
public abstract MembershipPasswordFormat PasswordFormat ...{ get; }
public abstract string PasswordStrengthRegularExpression ...{ get; }
public abstract bool RequiresQuestionAndAnswer ...{ get; }
public abstract bool RequiresUniqueEmail ...{ get; }
// Fields
private MembershipValidatePasswordEventHandler _EventHandler;
private const int SALT_SIZE_IN_BYTES = 0x10;
}

其中修飾符為internal是幾個方法是密碼的輔助方法,用於加密,解密和驗證密碼。但這邊的設計似乎有一些問題,將這些方法定義為internal范圍好像有點不妥,將這些方法定義在基類中,就是為了能夠被復用,但是從效果上來看,不是這樣的,因為internal的成員只允許在本程序集內被使用(正常情況下,不包括反射等其它方法),這就是說我們自己擴展的MembershipProvider是無法使用到這些方法的。而且從目前應用范圍來看,目前這些方法也只有在SqlMembershipProvider中被使用到,所以我認為應該將這些方法修飾符修改為protected。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved