Membership 詳解之 Membership 和 MembershipUser 類

來源:互聯網
上載者:User

上一篇博文呢,我介紹了 Provider 的一些基本的配置,

既然大家也瞭解了一些基本的 Provider 配置,

那麼在這裡便可以介紹前面提到的兩個重量級類了,

Membership 和 MembershipUser

這兩個類呢在前面也提到過,

Membership 呢可以說是統籌管理,是對整個的使用者群進行的管理,

而 MembershipUser 則是對單個的指定的使用者進行管理,

兩個類的方法和屬性都比較多(其實算是比較少的了)

不過歸根究底來講呢,也就是操作資料庫中表中資料的,

因為 Membership 是作為一套許可權管理機制開發的,

既然是許可權管理機制,那麼肯定就是對使用者的資訊,許可權進行管理了,

所以這兩個類說到底也就是對使用者的資訊的增刪改查,

當然咯,這其中涉及到一些安全啊,許可權等到邏輯的問題,這些我們暫且忽略掉,

我們只考慮增刪改查,

還是從 MSDN 上面拷貝點資訊過來吧,(下面的是 Membership 的公開方法和屬性)

寫的非常詳細了,MSDN 就是好啊,呵呵

方法

CreateUser
已重載。 將新使用者添加到資料存放區區。
DeleteUser
已重載。 從資料庫中刪除一個使用者。
FindUsersByEmail
已重載。 擷取一個成員資格使用者的集合,

其中的電子郵件地址包含要匹配的指定電子郵件地址。
FindUsersByName
已重載。 擷取一個成員資格使用者的集合,其中的使用者名稱包含要匹配的指定使用者名稱。
GeneratePassword
產生指定長度的隨機密碼。
GetAllUsers
已重載。 擷取資料庫中使用者的集合。
GetNumberOfUsersOnline
擷取當前訪問應用程式的使用者數。
GetUser
已重載。 從資料來源擷取成員資格使用者的資訊。
GetUserNameByEmail
擷取一個使用者名稱,其中該使用者的電子郵件地址與指定的電子郵件地址匹配。
UpdateUser
用指定使用者的資訊更新資料庫。
ValidateUser
驗證提供的使用者名稱和密碼是有效。

屬性

ApplicationName
擷取或設定應用程式的名稱。
EnablePasswordReset
獲得一個值,指示當前成員資格提供者是否配置為允許使用者重設其密碼。
EnablePasswordRetrieval
獲得一個值,指示當前成員資格提供者是否配置為允許使用者檢索其密碼。
HashAlgorithmType
用於雜湊密碼的演算法的標識符。
MaxInvalidPasswordAttempts
擷取鎖定成員資格使用者前允許的無效密碼或無效密碼提示問題答案嘗試次數。
MinRequiredNonAlphanumericCharacters
擷取有效密碼中必須包含的最少特殊字元數。
MinRequiredPasswordLength
擷取密碼所要求的最小長度。
PasswordAttemptWindow
擷取時間長度,在該時間間隔內對提供有效密碼或

密碼答案的連續失敗嘗試次數進行跟蹤。
PasswordStrengthRegularExpression
擷取用於計算密碼的Regex。
Provider
擷取對應用程式的預設成員資格提供者的引用。
Providers
擷取一個用於 ASP.NET 應用程式的成員資格提供者的集合。
RequiresQuestionAndAnswer
擷取一個值,該值指示預設成員資格提供者是否

要求使用者在進行密碼重設和檢索時回答密碼提示問題。
UserIsOnlineTimeWindow
指定使用者在最近一次活動的日期/時間戳之後被視為聯機的分鐘數。

事件

ValidatingPassword
在建立使用者、更改密碼或重設密碼時發生。

再來看一下 MembershipUser 在 MSDN 上的資料吧

也寫得非常詳細(下面是 MembershipUser 公開的屬性和方法)

方法

ChangePassword
更新成員資格資料存放區區中成員資格使用者的密碼。
ChangePasswordQuestionAndAnswer
更新成員資格資料存放區區中成員資格使用者的密碼提示問題和密碼提示問題答案。
GetPassword
已重載。 從成員資格資料存放區區擷取成員資格使用者的密碼。
ResetPassword
已重載。 將使用者密碼重設為一個自動產生的新密碼。
ToString
返回成員資格使用者的使用者名稱。 (重寫 Object..::.ToString()()()。)
UnlockUser
清除使用者的鎖定狀態以便可以驗證成員資格使用者。

屬性

Comment
擷取或設定成員資格使用者的特定於應用程式的資訊。
CreationDate
擷取將使用者添加到成員資格資料存放區區的日期和時間。
Email
擷取或設定成員資格使用者的電子郵件地址。
IsApproved
擷取或設定一個值,表示是否可以對成員資格使用者進行身分識別驗證。
IsLockedOut
擷取一個值,該值指示成員資格使用者是否因被鎖定而無法進行驗證。
IsOnline
擷取一個值,表示使用者當前是否聯機。
LastActivityDate
擷取或設定成員資格使用者上次進行身分識別驗證或訪問應用程式的日期和時間。
LastLockoutDate
擷取最近一次鎖定成員資格使用者的日期和時間。
LastLoginDate
擷取或設定使用者上次進行身分識別驗證的日期和時間。
LastPasswordChangedDate
擷取上次更新成員資格使用者的密碼的日期和時間。
PasswordQuestion
擷取成員資格使用者的密碼提示問題。
ProviderName
擷取成員資格提供者的名稱,該提供者儲存並檢索成員資格使用者的使用者資訊。
ProviderUserKey
從使用者的成員資格資料來源擷取使用者識別碼。
UserName
擷取成員資格使用者的登入名稱。

從上面的這些方法和屬性也可以看出,很多都是操作資料庫來實現增刪改查的,

既然如此,那麼我便寫了個 Demo 來示範增刪改查(查是間接包括的)

首先,看一下專案檔吧

首先是 Demo__5.aspx,其是使用 Membership.CreateUser 來完成的添加一個成員,

前面的一篇博文中曾寫過 CreateUserWizard 控制項,這裡可以說穿它了,

下面會老是提到 Membershi ,不過這裡的 Membershi 不是單指 Membership 類,

而是指的和 Membership 成員資格相關的一群類,

其實呢,它也就是一個外殼而已,真正起作用的是 Membership 了,

通過這個 Demo__5 的示範您就可以知道如何使用 Membership 來新增成員了,

而 Demo__6.aspx 則是選擇一名使用者,然後將使用者的資訊進行刪除

而 Demo__7.aspx 則是郎闊了使用 Membership 來實現更改當前登陸者密碼,

使用 Membership 來實現更改當前登陸者郵箱地址,

使用 Membership 來實現更改當前登陸者密碼提示問題,

先看 Demo__5.aspx 吧

Code-Behind

using System;
using System.Web.Security;

namespace WebForm
{
    public partial class Demo__5 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnCreateUser_Click(object sender, EventArgs e)
        {
            if (txtFirstPwd.Text == txtSecondPwd.Text)
            {
                //聲明一個 MembershipCreateStatus
                //以儲存在建立使用者過程中建立的狀態
                MembershipCreateStatus createUserStatus;
                //調用 Membership.CreateUser() 來建立
                //並且把 MembershipCreateStatus 對象傳遞給了這個方法
                Membership.CreateUser(txtName.Text, txtFirstPwd.Text,
                    txtMail.Text, txtQuestion.Text,
                    txtAnswer.Text, true, out createUserStatus);
                //取得建立過程中的狀態值的字串表示
                //可以使用 MembershipCreateStatus .  這種方式來得到智能提示
                //從而得到所有的結果字串如下所有的 case 中
                switch (createUserStatus.ToString())
                {
                    case "DuplicateEmail":
                        lblMsg.Text = "您註冊的郵箱已經存在了!!!";
                        break;
                    case "DuplicateProviderUserKey":
                        lblMsg.Text = "您註冊的郵箱已經存在了!!!";
                        break;
                    case "DuplicateUserName":
                        lblMsg.Text = "您註冊的使用者名稱已經存在了!!!";
                        break;
                    case "InvalidAnswer":
                        lblMsg.Text = "密碼恢複問題解答驗證失敗!!!";
                        break;
                    case "InvalidEmail":
                        lblMsg.Text = "郵箱驗證失敗!!!";
                        break;
                    case "InvalidPassword":
                        lblMsg.Text = "密碼驗證失敗!!!";
                        break;
                    case "InvalidProviderUserKey":
                        lblMsg.Text = "無效的提供者使用者索引!!!";
                        break;
                    case "InvalidQuestion":
                        lblMsg.Text = "密碼恢複問題驗證失敗!!!";
                        break;
                    case "InvalidUserName":
                        lblMsg.Text = "使用者名稱驗證失敗!!!";
                        break;
                    case "ProviderError":
                        lblMsg.Text = "提供者返回錯誤!!!";
                        break;
                    case "Success":
                        lblMsg.Text = "恭喜您,註冊成功!!!";
                        txtName.Text = String.Empty;
                        txtAnswer.Text = String.Empty;
                        txtFirstPwd.Text = String.Empty;
                        txtMail.Text = String.Empty;
                        txtQuestion.Text = String.Empty;
                        txtSecondPwd.Text = String.Empty;
                        break;
                    case "UserRejected":
                        lblMsg.Text = "提供者定義問題造成建立失敗!!!";
                        break;
                    default:                       
                        break;
                }
                lblMsg.Text += "    " + createUserStatus.ToString();
            }
            else
            {
                lblMsg.Text = "兩次輸入的密碼不一致,請核對!!!";
            }
        }
    }
}

Demo__5.aspx 的效果

註冊一個 BaoBeiMe 的使用者名稱

原先的資料庫中的內容(並沒有 BaoBeiMe )

建立使用者成功後的資料庫

上面的 Demo__5.aspx 示範了使用 Membership 來完成註冊功能,

那麼下面的 Demo__6.aspx 則要完成刪除使用者功能了

直接看 Code-Behind 吧

using System;
using System.Web.Security;

namespace WebForm
{
    public partial class Demo__6 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //獲得當前資料庫中所有的使用者資訊
                ddlUserName.DataSource = Membership.GetAllUsers();
                //將 UserName 和 Email 進列欄位的綁定
                //在這裡為何指定是要綁定 UserName 和 Email 呢
                //各位可以查看資料庫中預存程序 aspnet_Membership_GetAllUsers
                //在這個預存程序中對操作的欄位都有名字可以查閱
                //或者您也可以直接查看 aspnet_Users 和 aspnet_Membership 資料庫
                //您要綁定的欄位名稱也就是資料庫中的欄位名稱
                //上面的這點取決於微軟的命名規則
                //各位靠猜應該也可以猜到的
                //呵呵

                ddlUserName.DataTextField = "UserName";
                ddlUserName.DataValueField = "Email";
                ddlUserName.DataBind();
            }
        }

        protected void ddlUserName_SelectedIndexChanged(object sender, EventArgs e)
        {
            lblMain.Text = ddlUserName.SelectedValue.ToString();
        }

        protected void btnDelete_Click(object sender, EventArgs e)
        {
            if (!checkboxDeleteAll.Checked)
            {
                //刪除指定使用者名稱在資料庫中的基本資料
                if (Membership.DeleteUser(ddlUserName.SelectedItem.Text))
                {
                    lblMsg.Text = ddlUserName.SelectedItem.Text +
                        "  該名使用者的基本資料已經被刪除了!!!";

                    ddlUserName.Items.Clear();
                    ddlUserName.DataSource = Membership.GetAllUsers();
                    ddlUserName.DataTextField = "UserName";
                    ddlUserName.DataValueField = "Email";
                    ddlUserName.DataBind();
                }
                else
                {
                    lblMsg.Text = ddlUserName.SelectedItem.Text +
                        "  基本資料刪除失敗!!!";
                }
            }
            else
            {
                //刪除指定使用者名稱在資料庫中的全部資訊
                if (Membership.DeleteUser(ddlUserName.SelectedItem.Text, true))
                {
                    lblMsg.Text = ddlUserName.SelectedItem.Text +
                        "  該名使用者在資料庫中的所有資訊已經被刪除了!!!";
                    ddlUserName.Items.Clear();
                    ddlUserName.DataSource = Membership.GetAllUsers();
                    ddlUserName.DataTextField = "UserName";
                    ddlUserName.DataValueField = "Email";
                    ddlUserName.DataBind();
                }
                else
                {
                    lblMsg.Text = ddlUserName.SelectedItem.Text +
                        "  在資料庫中的所有資訊刪除失敗!!!";
                }
            }
        }
    }
}

還是示範將剛才註冊的 BaoBeiMe 進行刪除吧

其中您可以選擇刪除所有資訊或者刪除基本資料(不勾選 CheckBox)

所謂刪除基本資料指的是刪除 aspnet_User 和 aspnet_Membership 中的內容,

再看資料庫中巴

可見刪除是成功的

接下來就是要看 Demo__7 . aspx 了,

這個 Demo__7 寫的稍微大了點,

因為我是修改的要經過 Forms 登入驗證的使用者的資訊,所有使用者必須先登入才能修改,

如果沒有進行登陸的話,直接瀏覽 Demo__7 ,

那麼會自動跳轉到 web.config 中設定的 loginUrl 出(前面博文有介紹的)

先看一下介面吧,

然後再看 Code-Behind 吧

using System;
using System.Web.Security;

namespace WebForm
{
    public partial class Dem0__7 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //如果目前使用者還沒有登陸的話
            //就跳轉到 web.config 中由 loginUrl 指定的登陸頁
            if (User.Identity.IsAuthenticated == false)
            {
                FormsAuthentication.RedirectToLoginPage();
            }
        }

        //實現使用者密碼提示問題和解答的更改
        protected void btnUpdatePwdQuestion_Click(object sender, EventArgs e)
        {
            //擷取當前登陸在該頁面上的使用者即一個 MembershipUser 對象
            MembershipUser memberUser =
                Membership.GetUser(User.Identity.Name);

            if ((!String.IsNullOrEmpty(txtPwd.Text)) &&
                (!String.IsNullOrEmpty(txtQuestion.Text)) &&
                (!String.IsNullOrEmpty(txtAnswer.Text)))
            {
                //調用 MembershipUser 類對象的 ChangePasswordQuestionAndAnswer()
                //來修改使用者的密碼恢複提示問題
               if (memberUser.ChangePasswordQuestionAndAnswer(txtPwd.Text,
                    txtQuestion.Text, txtAnswer.Text))

                {
                    lblPwdQuesionMsg.Text =
                        "恭喜您,更改密碼提示問題成功!!!";
                }
                else
                {
                    lblPwdQuesionMsg.Text =
                        "請檢查密碼的合法性以及資料是否合法!!!";
                }
            }
            else
            {
                lblPwdQuesionMsg.Text =
                    "您輸入更改密碼提示問題的資料不合法,請核對";
            }
        }

       //實現使用者密碼的更改
        protected void btnPwdUpdate_Click(object sender, EventArgs e)
        {
            MembershipUser memberUser =
                Membership.GetUser(User.Identity.Name);

            if (txtNewFirstPwd.Text == txtNewSecondPwd.Text &&
                (!String.IsNullOrEmpty(txtNewFirstPwd.Text)) &&
                (!String.IsNullOrEmpty(txtOldPwd.Text)))
            {
               //調用 MembershipUser 類對象的 ChangePassword()
                //來修改使用者的密碼
                if (memberUser.ChangePassword(txtOldPwd.Text,
                    txtNewFirstPwd.Text))

                {
                    lblPwdMsg.Text = "密碼更改成功!!!";
                }
                else
                {
                    lblPwdMsg.Text =
                        "密碼更新失敗,請檢查原始密碼的正確性!!!";
                }
            }
            else
            {
                lblPwdMsg.Text =
                    "資料不合法,請核對!!!";
            }
        }

        //實現使用者郵箱的更改
        protected void btnEmailUpdate_Click(object sender, EventArgs e)
        {
            MembershipUser memberUser =
                Membership.GetUser(User.Identity.Name);

            if (!String.IsNullOrEmpty(txtMail.Text))
            {
                try
                {
                    //調用 MembershipUser 類對象的 Email 屬性來
                    //更當前登陸使用者的 Email 資料
                    //並且需要調用 Membership 的 UpdateUser 方法進行更新
                    memberUser.Email = txtMail.Text;
                    Membership.UpdateUser(memberUser);
                    lblEmailMsg.Text = "恭喜您,更改使用者資料成功!!!";
                }
                catch (Exception exc)
                {
                    lblEmailMsg.Text = "郵箱地址更新失敗!!!" +
                        exc.Message;
                }
            }
            else
            {
                lblEmailMsg.Text = "請指定郵箱地址!!!";
            }
        }
    }
}

然後就是看效果了,先看資料庫中的資料吧,

我還是選擇修改 XiaoZhen 的資料吧,

其實主要是看一下修改的 Email 和 密碼恢複提示問題的效果,

而對於密碼更改的效果比較難看出來,因為是加密過的密碼,

鬼曉得是些什麼東西在裡面啊,呵呵,

在 aspnet_Membership 中的郵箱和密碼問題都是清一色的,

我更改資料以後呢,(先必須以 XiaoZhen 登入)

再來看資料庫

可見我的更改時成功的,

在這裡大費周章的示範了這麼多,也了 n 張,無非是想讓大家更加理解,

其執行的結果,同時,附上的代碼也寫了很多的注釋,很詳細。

                                              2010—2—06

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.