2012年10月8日 星期一

Membership

前一章介紹的 Profile 類別,是用來存取個人資料。 而這一章介紹的 Membership 類別,則是用來管理帳號與授權的類別。

使用網站管理工具設定安全性

WSAT

You can use the Web Site Administration Tool (WSAT) to define and manage users, roles, and security on your site.

Creating Users

這個畫面中的項目限制會依據 MembershipProvider 中的屬性設定來管理,例如指定密碼的最小長度或者使用特定字元等限制。

關於這個機制的安全性的限制,可參考 MSDN: MembershipProvider 屬性

預設 MembershipProvider 的屬性值,會要求密碼長度至少為7,非英數字元至少為1。
若要變更這些設定,可以參考下面範例:

<system.web>
    <membership>
        <providers>
        <remove name="AspNetSqlMembershipProvider"/>
        <add
            name="AspNetSqlMembershipProvider"
            connectionStringName="LocalSqlServer"
            type="System.Web.Security.SqlMembershipProvider"
            requiresQuestionAndAnswer="false"
            passwordFormat="Clear"
            minRequiredNonalphanumericCharacters="0" 
            minRequiredPasswordLength="4"/>
        </providers>
    </membership>
</system.web>
  • passwordFormat="Clear" : 使用明碼。
  • minRequiredNonalphanumericCharacters="0" : 非英數字元數量。
  • minRequiredPasswordLength="4" : 最小長度。

Creating Roles

要啟用會員機制的角色功能,必須啟用角色。

<system.web>
    <roleManager enabled="true" />
</system.web>

Creating Access Rules

這個會員機制也提供存取權限設定,它可以針對使用者或角色定義目錄層級的存取權限。 並將設定內容存放在 web.config 。

<authorization>
    <deny users="?" />
    <allow roles="系統管理員" />
</authorization>

登入控制項

ASP.NET 提供許多驗證或管理使用者的控制項,以簡化登入功能的程。與登入相關的控制項,共有7個:

  1. CreateUserWizard :建立帳號的頁面。
  2. Login :登入頁面。
  3. LoginView
  4. LoginStatus :提供登入/登出連結。
  5. LoginName :提供登入者名稱
  6. PasswordRecovery :提供登入者密碼還原的頁面。
  7. ChangePassword :提供登入者變更密碼的頁面。

底下四個主題,分別介紹如何使用登入控制項,在不撰寫程式碼的原則下,設計可以執行「建立使用者」,「登入」,「密碼變更」,「密碼復原」功能的頁面。

註冊頁面

You can use the CreateUserWizard control to create a page that allows users to create their own accounts using the standard ASP.NET membership. This control can be added to a page and will automatically work with the provider talking to ASPNETDB.

這個 CreateUserWizard 控制項,也會依據 MembershipProvider 中的屬性設定值來當做密碼強度的驗證基礎。

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" 
    DisplaySideBar="True" 
    ContinueDestinationPageUrl="~/UserHome.aspx"
    oncontinuebuttonclick="CreateUserWizard1_ContinueButtonClick" 
    oncreateduser="CreateUserWizard1_CreatedUser">
    <TextBoxStyle Font-Names="細明體" />
    <SideBarStyle VerticalAlign="Top" />
</asp:CreateUserWizard>

事件

  • ContinueButtonClick :這個事件發生於使用者按一下最終使用者帳戶建立步驟中的 [繼續] 按鈕時。
  • CreatedUser :個事件發生於建立新的網站使用者帳戶之後。可以用來繼續設定額外的會員資料。

屬性

  • ContinueDestinationPageUrl :設定使用者在完成註冊後使用者會造訪的網頁 URL,例如首頁或成員網頁。
  • EditProfileText :設定連往使用者設定檔編輯頁之連結的文字標題。
  • EditProfileUrl :設定使用者設定檔編輯頁的 URL。

登入頁面

This Login control is used to prompt a user for his or her credentials. The Login control also includes features for validation to ensure the user types a user name and password.

設定預設的登入頁

在建立登入頁面前,必須先在 web.config 中指定登入頁名稱 (loginUrl) ,若沒有指定,預設使用 login.aspx 。

<authentication mode="Forms">
    <forms loginUrl="Login.aspx" />
</authentication>

建立 Login 控制項

<asp:LoginView ID="LoginView1" runat="server">
    <AnonymousTemplate>
        請輸入登入資料
    </AnonymousTemplate>
    <LoggedInTemplate>
        <asp:LoginName ID="LoginName1" runat="server" />您好.
        <asp:LoginStatus ID="LoginStatus1" runat="server" />
    </LoggedInTemplate>
</asp:LoginView>

<asp:Login ID="Login1" runat="server" 
    DisplayRememberMe="true"
    RememberMeSet="true" 
    CreateUserText="請按這裡立即註冊" CreateUserUrl="~/Register.aspx"
    PasswordRecoveryText="忘記密碼?" PasswordRecoveryUrl="~/RecoverPassword.aspx"
    VisibleWhenLoggedIn="false"
    PasswordLabelText="請輸入密碼:" 
    UserNameLabelText="請輸入名稱:">
    <TextBoxStyle Font-Names="細明體" />
</asp:Login>

設定 Login 控制項的驗證欄位

這個控制項中的每個屬性都有各自的驗證控制項,如果不符合設定,就會出現星號提示。 你也可以再自行增加一個 ValidationSummary 控制項,以顯示實際的驗證錯誤訊息。 要設定 ValidationSummary 控制項,只要將其 ValidationGroup 屬性設成 Login 控制項的 ID 即可。

<asp:Login ID="Login1" runat="server" onloggingin="Login1_LoggingIn"></asp:Login>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="Login1" />

使用自己的會員機制驗證

若已有現成的會員資料庫系統,若想搭配 Login 控制項,則可以在 Authenticate 事件撰寫驗證邏輯。 這個事件會由使用者按下「登入」按鈕時觸發。:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    string sUserID;
    if (MyValidate(Login1.UserName, Login1.Password, out sUserID))
    {
        //導到預設網頁 FormsAuthentication.DefaultUrl
        bool isPersistent = Login1.RememberMeSet;
        FormsAuthentication.RedirectFromLoginPage(sUserID, isPersistent);

        //isPersistent=false, 則使用暫時性 Cookie ,也就是將 Cookie 存放在記憶體之中,瀏覽器關掉就自動清除。
    }
}

密碼復原

The PasswordRecovery control assists users if they forget their password. This control enables users to type their user name and receive a new, random password via e-mail. E-mails are sent based on the configured e-mail provider in Web.config. Optionally, users can also be required to answer a security question before their password is sent.

<system.net>
<mailSettings>
    <smtp from="user@gmail.com">
    <network host="smtp.gmail.com" userName="user@gmail.com" password="pwd" port="587" enableSsl="true"/>
    </smtp>
</mailSettings>
</system.net>
<asp:PasswordRecovery ID="PasswordRecovery1" runat="server">
</asp:PasswordRecovery>

這個控制項提供幾個事件,可以讓我們記錄使用者輸入的資訊。

密碼變更

This ChangePassword control allows users to enter their current password and create a new one. On completion, you can either show a success message or automatically navigate to another page. To enable the latter scenario, you can set the SuccessPageUrl property of the ChangePassword control.

<asp:ChangePassword ID="ChangePassword1" runat="server" 
    SuccessPageUrl="~/UserHome.aspx" 
    EditProfileText="修改個人資料" 
    EditProfileUrl="~/UserHome.aspx"  >
    <SuccessTemplate>
    </SuccessTemplate>
</asp:ChangePassword>

使用程式碼建立會員資料

由上一節介紹知道,只要透過登入控制項,就可以不用寫任何程式碼,就可以做到建立與管理會員資料的功能。 如果想要完全由程式碼來操作,當然也可以,只要透過 MembershipRoles 類別,就可以使用程式嗎來管理會員與角色資料。

The Membership Class

Membership 是一個靜態類別,可以用來建立、刪除、尋找使用者的資料。它提供以下方法:

The Roles Class

Roles 也是一個靜態類別, 主要功能有新增或移除角色中的成員、建立或刪除角色、判斷使用者的角色。 它提供以下方法:

Roles 類別是用來管理會員機制的群組,若網站是使用 Windows 認證,是不可以用 Roles 來管理 Windows 使用者群組的。

自訂 MembershipProvider

當預設的會員機制不夠需求,又不想完全實作會員機制,就可以利用繼承 MembershipProvider 的方式,來擴充該機制的功能。 可以參考底下幾篇文章的做法。

沒有留言:

張貼留言