共用方式為


成員資格

Microsoft提供

注意

自本文撰寫以來,ASP.NET 成員資格提供者已被 ASP.NET 身分識別取代。 強烈建議您更新應用程式以使用 ASP.NET 身分識別 平臺,而不是本文撰寫時精選的成員資格提供者。 ASP.NET 身分識別對於 ASP.NET 成員資格系統有一些優點,包括 :

  • 更好的效能
  • 改善擴充性和可測試性
  • 支援 OAuth、OpenID Connect 和雙因素驗證
  • 宣告型身分識別支援
  • 與 ASP.Net Core 更好的互通性

ASP.NET 成員資格是以來自 ASP.NET 1.x 的表單驗證模型成功為基礎。 ASP.NET Forms 驗證提供方便的方式,將登入表單併入 ASP.NET 應用程式中,並驗證使用者對資料庫或其他資料存放區。

ASP.NET 成員資格是以來自 ASP.NET 1.x 的表單驗證模型成功為基礎。 ASP.NET Forms 驗證提供方便的方式,將登入表單併入 ASP.NET 應用程式中,並驗證使用者對資料庫或其他資料存放區。 FormsAuthentication 類別的成員可讓您處理 Cookie 以進行驗證、檢查有效的登入、登出使用者等等。不過,在 ASP.NET 1.x 應用程式中實作表單驗證可能需要相當多的程式碼。

ASP.NET 2.0 的成員資格是單獨使用表單驗證的主要進展。 (成員資格與表單驗證結合時最強固,但使用表單驗證並非必要。) 您很快就會看到,您可以使用 ASP.NET Membership 和 ASP.NET 2.0 中的登入控制項來實作功能強大的成員資格系統,完全不需要撰寫許多程式碼。

在 ASP.NET 2.0 中實作成員資格

成員資格是依照四個步驟來實作。 請記住,牽涉到許多子步驟,以及可實作的選擇性設定。 這些步驟旨在說明設定成員資格的概觀。

  1. 如果使用SQL Server作為成員資格存放區,請建立您的成員資格資料庫 (。)

  2. 在應用程式組態檔中指定成員資格選項。 預設會啟用 (成員資格。)

  3. 決定您想要使用的成員資格存放區類型。 選項為:

    • Microsoft SQL Server (7.0 版或更新版本)
    • Active Directory 存放區
    • 自訂成員資格提供者
  4. 設定應用程式以 ASP.NET 表單驗證。 同樣地,成員資格的設計目的是要利用表單驗證,但不需要使用表單驗證。

  5. 視需要定義成員資格的使用者帳戶,並設定角色。

建立成員資格資料庫

如果您使用 SQL Server 7.0 或更新版本作為成員資格存放區,您可以使用 aspnet_regsql 公用程式, (Visual Studio .NET 2005 命令提示字元) 來設定資料庫。 aspnet_regsql公用程式可作為命令提示字元工具或透過 GUI 精靈使用。 精靈方法是設定資料庫最簡單的方式。 若要存取精靈,只需執行下列命令:

aspnet_regsql W

執行此命令之後,您會看到 [ASP.NET SQL Server安裝精靈],如下所示。

顯示 [S P 點 NET S Q L 伺服器安裝精靈] 的螢幕擷取畫面。

圖 1

ASP.NET SQL Server安裝精靈會在您在精靈中指定的實例中建立網站。 不過,ASP.NET 會使用machine.config檔案中的連接字串來連線到您的資料庫。 根據預設,此連接字串會指向 SQL Server 2005 實例,因此如果您使用 SQL Server 2000 或 SQL Server 7.0 實例,您必須修改machine.config檔案中的連接字串。 該連接字串可以在這裡找到:

<configuration>
    <connectionStrings>
      <add name="LocalSqlServer"
         connectionString="data source=(local);
         Integrated Security=SSPI;Initial Catalog=aspnetdb;"  
         providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

不幸的是,如果您未修改連接字串,ASP.NET 不會提供描述性錯誤。 它只會繼續抱怨您尚未建立資料庫。 在上述案例中,我修改了連接字串以指向本機 SQL Server 2000 實例。

指定設定和新增使用者和角色

設定成員資格的下一個步驟是將必要資訊新增至應用程式的web.config檔案。 在 ASP.NET 1.x 中,修改web.config檔案有時很困難,因為使用 lowerCamelCase 和缺少 Intellisense。 Visual Studio .NET 2005 可讓您更輕鬆地使用 Intellisense 進行組態檔的工作,但 ASP.NET 2.0 提供 Web 介面來編輯組態檔,進一步進行一個步驟。

您可以按一下方案總管工具列上的 [ASP.NET 組態] 按鈕,以啟動 Web 介面,如下所示。 您也可以透過插入登入控制項時顯示的快顯視窗來啟動 Web 介面。

顯示已選取web.config方案總管工具列的螢幕擷取畫面。

圖 2

這會啟動 ASP.NET 網站管理工具,如下所示。 ASP.NET 網站管理是四個索引標籤介面,可讓您輕鬆地管理應用程式設定。 下列索引標籤可供使用:

  • 家中
  • 安全 設定使用者、角色和存取權。
  • 應用 設定應用程式設定。
  • 供應商 設定及測試您的應用程式成員資格提供者。

網站管理工具可讓您輕鬆地建立新的使用者、建立新的角色,以及管理使用者和角色。 Windows 介面中無法使用這項功能。 Windows 介面可讓您輕鬆地定義授權設定,以及新增、刪除及管理不在網站管理工具中的提供者、 功能。

若要啟動 Windows 介面,請開啟 Internet Information Services 嵌入式管理單元,以滑鼠右鍵按一下您的應用程式,然後選擇 [屬性]。 按一下 [ASP.NET] 索引標籤,然後按一下 [編輯組態] 按鈕。 (應用程式必須在 ASP.NET 2.0 下執行,才能啟用 [編輯組態] 按鈕。您也可以在 [ASP.NET] 對話方塊中設定 ASP.NET 版本。) [ASP.NET 組態設定] 對話方塊隨即顯示,如下所示。

顯示 [A S P 點 N E T 組態設定] 對話方塊上 [一般] 索引標籤的螢幕擷取畫面。

圖 3

在 [一般] 索引標籤上,會列出連接字串和應用程式設定。 斜體中的任何設定都定義在父組態檔中, (machine.config或較高層級web.config) ,而非斜體中的設定則來自應用程式組態檔。 如果在應用層級新增、移除或編輯設定,ASP.NET 將會新增、移除或修改應用層級的設定web.config,而不是從繼承它的組態檔中移除設定。

[驗證] 索引標籤如下所示。 這是您將設定成員資格設定的位置。 您可以在這裡設定表單驗證設定、成員資格提供者和角色提供者。

顯示 [A S P 點 N E T 組態] 對話方塊上 [驗證] 索引標籤的螢幕擷取畫面。

圖 4

在應用程式中實作成員資格

在應用程式中實作 ASP.NET 2.0 成員資格最簡單的方式,就是使用提供的登入控制項。 這個方法可讓您實作 ASP.NET 2.0 成員資格的基本概念,而不需要撰寫任何程式碼。

ASP.NET 2.0 中提供下列登入控制項:

登入控制項

登入控制項提供一個介面,可供某人登入您的成員資格系統。 它提供使用者名稱和密碼文字方塊和登入按鈕。 許多其他常見的功能,例如註冊尚未完成之人員的連結、允許使用者在後續造訪時自動登入的核取方塊、密碼提醒的連結等等。登入控制項的所有功能都可以透過 控制項的屬性來自訂。

在 ASP.NET 1.x 中,開發人員必須在使用表單驗證時撰寫相當數量的程式碼來執行查閱。 透過 ASP.NET 2.0 成員資格,您可以驗證使用者,而不需要撰寫任何程式碼。 ASP.NET 會自動為您查閱使用者。 (如果您使用 Login 控制項而不使用 ASP.NET 成員資格,您可以使用 OnAuthenticate 方法來驗證 user.)

LoginView 控制項

LoginView 控制項是預設提供兩個範本的樣板化控制項;AnonymousTemplate 和 LoggedInTemplate。 顯示的範本取決於使用者是否已登入您的成員資格系統。 當使用者尚未登入時,這個控制項通常用來顯示 Login 控制項,以及使用者登入時的 LoginStatus 控制項和/或其他登入控制項。 如果您在 ASP.NET 應用程式中使用角色管理,LoginView 控制項可以根據使用者角色顯示特定的範本。 (稍後將涵蓋 ASP.NET 角色管理的詳細資訊。)

PasswordRecovery 控制項

PasswordRecovery 控制項可讓使用者收到具有目前密碼的電子郵件,或重設其密碼。 純文字和加密的密碼可以復原並傳送電子郵件給使用者。 如果密碼已雜湊,則無法復原。 相反地,使用者必須執行密碼重設。

LoginStatus 控制項

LoginStatus 控制項可用來顯示登入指標給未登入的使用者,以及目前登入的使用者登出指標。 Request.IsAuthenticated 屬性可用來判斷要顯示的指標。 LoginStatus 控制項顯示的指標可以是透過 LoginTextLogoutText 屬性實作的文字 (,) 或透過 LoginImageUrlLogoutImageUrl 屬性實作 (的影像。)

當使用者透過 LoginStatus 控制項登出時,會重新導向至 LogoutPageUrl 屬性所指定的 URL。 如果未設定該屬性,則會重新整理目前的頁面。 由於網站可能受到 Forms 驗證的保護,所以目前頁面的重新整理會將使用者重新導向至網站的登入頁面。

LoginName 控制項

LoginName 控制項會顯示目前登入網站之使用者的使用者名稱。

CreateUserWizard 控制項

CreateUserWizard 控制項為使用者提供註冊成員資格系統的便利方式。 您可以透過如下所示的介面,新增 (實作為 WizardSteps 集合的步驟) 。

顯示 [建立使用者精靈工作] 對話方塊的螢幕擷取畫面,其中包含要註冊新帳戶的下拉式功能表。

圖 5

CreateUserWizard 是衍生自 Wizard 類別的樣板化控制項,並提供下列範本:

  • HeaderTemplate 此範本會控制精靈標頭的外觀。
  • SidebarTemplate 此範本會控制精靈提要欄的外觀。
  • StartNavigationTemplate 此範本會控制導覽在開始步驟中的精靈外觀。
  • StepNavigationTemplate 當不在開始或完成步驟中時,此範本會控制流覽區域的外觀。
  • FinishNavigationTemplate 此範本會在完成步驟時控制流覽區域的外觀。

此外,針對您新增至精靈的每個步驟,ASP.NET 會建立自訂範本,其中包含該步驟的 ContentTemplate 和 CustomNavigationTemplate。 如需自訂 CreateUserWizard 的完整詳細資料,請參閱 VS.NET 2005 檔:

ChangePassword 控制項

ChangePassword 控制項可讓使用者變更其密碼。 如果 DisplayUserName 屬性為 true, (預設為 false) ,則使用者可在未登入時變更其密碼。 如果使用者 已經登入 ,且 DisplayUserName 屬性為 true,使用者將能夠變更其他使用者的密碼,前提是他們知道該使用者的使用者識別碼。

請記住,如果您希望使用者能夠在不需登入的情況下變更密碼,您必須確保顯示 ChangePassword 控制項的頁面允許匿名存取。 很明顯地,使用者必須提供舊密碼,才能變更其密碼。

角色管理

角色管理可讓您將使用者指派給特定角色,然後根據該角色限制特定檔案或資料夾的存取權。 角色管理也提供 API,讓您可以以程式設計方式判斷某人角色,或判斷特定角色中的所有使用者,並據以回應。

角色管理不是 ASP.NET 成員資格的需求,也不是使用角色管理所需的成員資格。 不過,這兩者會妥善地補充彼此,而且開發人員可能會將它們彼此搭配使用。

若要在您的應用程式中啟用角色管理,請在web.config檔案中進行下列變更:

<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />

cacheRolesInCookie 屬性設定為 true 時,ASP.NET 會在用戶端上的 Cookie 中快取使用者角色成員資格。 這可讓角色查閱在沒有呼叫 RoleProvider 的情況下發生。 使用此屬性時,建議開發人員確保 cookieProtection 屬性設定為 All。 (這是預設設定。) 這可確保 Cookie 資料已加密,並有助於確保 Cookie 內容尚未變更。 您可以使用網站管理工具來新增角色。 它可讓您輕鬆地定義角色、根據這些角色設定月臺部分的存取權,以及將使用者指派給角色。

顯示具有 [新增角色] 按鈕的 S P 點 N E T 網站管理工具的螢幕擷取畫面。

圖 6

如上所示,只要輸入角色的名稱,然後按一下 [新增角色],即可新增新的角色。 按一下現有角色清單中的適當連結,即可管理或刪除現有的角色。

當您管理角色時,您可以新增或移除使用者,如下所示。

此螢幕擷取畫面顯示具有 [尋找使用者] 按鈕的 A P 點 N E T 網站管理工具。

圖 7

藉由核取 [使用者處於角色] 核取方塊,您可以輕鬆地將使用者新增至特定角色。 ASP.NET 會自動使用適當的專案更新您的成員資格資料庫。 您也會想要設定應用程式的存取規則。 ASP.NET 1.x 開發人員熟悉透過 < web.config 檔案中的授權 > 元素來執行此動作,而且該選項仍可在 ASP.NET 2.0 中使用。 不過,使用網站管理工具更輕鬆地管理存取規則,如下所示。

顯示 [S P 點 N E T 網站管理工具] 的螢幕擷取畫面,其中已選取 [使用者和角色] 底下的專案。

圖 8

在此情況下,系統管理資料夾會反白顯示, (難以看到,因為工具會以淺灰色) 反白顯示,而且系統管理員角色已獲得存取權。 所有其他使用者都會遭到拒絕。 您可以按一下前端圖示來選取規則,然後使用 [上移] 和 [下移] 按鈕來排列規則。 如同 ASP.NET < 授權 > 元素,規則會依出現的順序進行處理。 換句話說,如果上述快照中的規則順序已反轉,則沒有人可以存取 [系統管理] 資料夾,因為 ASP.NET 遇到的第一個規則就是拒絕所有人存取資料夾的規則。

ASP.NET 2.0 會將web.config檔案新增至您要指定存取規則的資料夾。 您可以透過組態檔或網站管理工具編輯存取規則。 換句話說,網站管理工具只是可在使用者易記的環境中編輯組態檔的介面。

在程式碼中使用角色

自 1.x 版以來,角色管理的 API 尚未變更。 IsInRole方法可用來判斷使用者是否處於特定角色。

if (User.IsInRole(Administrators)) {
    btnManageSite.Visible = true;
}

ASP.NET 也會建立 RolePrincipal 實例作為目前內容的成員。 RolePrincipal 物件可用來取得使用者所屬的所有角色,如下所示:

string[] userRoles = ((RolePrincipal)User).GetRoles();

搭配 LoginView 控制項使用 RoleGroups

現在您已瞭解角色管理和成員資格,讓我們簡短討論 LoginView 控制項如何在 ASP.NET 2.0 中利用這項功能。 如先前所述,LoginView 控制項是預設包含兩個範本的樣板化控制項;AnonymousTemplate 和 LoggedInTemplate。 在 [LoginView 工作] 對話方塊中,有一個連結 (如下所示,) 可讓您編輯 RoleGroups。

顯示 [登入檢視工作] 對話方塊內 [登入檢視] 控制項的螢幕擷取畫面,其中已選取下拉式清單和 [角色群組]。

圖 9

每個 RoleGroup 物件都包含字串陣列,定義 RoleGroup 所套用的角色。 若要將新的 RoleGroup 新增至 LoginView 控制項,請按一下 [編輯 RoleGroups] 連結。 在上圖中,您可以看到我已為系統管理員新增 RoleGroup。 從 [檢視] 下拉式清單中選取該 RoleGroup (RoleGroup[0]) ,我可以設定只會顯示給 Administrators 角色成員的範本。 在下圖中,我新增了新的 RoleGroup,其適用于 Sales 角色的成員和散發角色。 這會將第二個 RoleGroup 新增至 [登入檢視工作] 對話方塊中的 [檢視] 下拉式清單,而新增至該範本的任何專案都會由 Sales 或 Distribution 角色中的任何使用者顯示。

顯示 [角色群組集合編輯器] 對話方塊的螢幕擷取畫面,其中包含選取 [系統管理員] 的下拉式清單。

圖 10

覆寫現有的成員資格提供者

有幾種方式可以擴充 ASP.NET 成員資格的功能。 首先,您可以藉由繼承 SqlMembershipProvider 類別並覆寫其方法,明顯地變更其現有功能。 例如,如果您想要在建立使用者時實作自己的功能,您可以建立繼承自 SqlMembershipProvider 的專屬類別,如下所示:

public class jForumMembershipProvider : SqlMembershipProvider {
    public jForumMembershipProvider() {

    }
    public override MembershipUser CreateUser(
    string username,
    string password,
    string email,
    string passwordQuestion,
    string passwordAnswer,
    bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status) {
        // your own implementation
        return base.CreateUser(
        username,
        password,
        email,
        passwordQuestion,
        passwordAnswer,
        isApproved,
        providerUserKey,
        out status);
    }
}

另一方面,如果您想要建立自己的提供者 (將成員資格資訊儲存在 Access 資料庫中,例如) ,您可以建立自己的提供者。

建立您自己的成員資格提供者

若要建立您自己的成員資格提供者,您必須先建立繼承自 MembershipProvider 類別的類別。 如果您使用 VB.NET,Visual Studio 2005 將會針對您需要覆寫的所有方法新增存根。 如果您使用 C#,則最多可以新增存根。

您必須覆寫下列專案:

  • ApplicationName 屬性
  • ChangePassword 函式
  • ChangePasswordQuestionAndAnswer 函式
  • CreateUser 函式
  • DeleteUser 函式
  • EnablePasswordReset 屬性
  • EnablePasswordRetrieval 屬性
  • FindUsersByEmail 函式
  • FindUsersByName 函式
  • GetAllUsers 函式
  • GetNumberOfUsersOnline 函式
  • GetPassword 函式
  • GetUser 函式
  • GetUserNameByEmail 函式
  • MaxInvalidPasswordAttempts 屬性
  • MinRequiredNonAlphanumericCharacters 屬性
  • MinRequiredPasswordLength 屬性
  • PasswordAttemptWindow 屬性
  • PasswordFormat 屬性
  • PasswordStrengthRegularExpression 屬性
  • RequiresQuestionAndAnswer 屬性
  • RequiresUniqueEmail 屬性
  • ResetPassword 函式
  • 解除鎖定使用者函式
  • UpdateUser 函式
  • ValidateUser 函式

這是實作為 C# 開發人員的相當一份清單。 您可能會發現在沒有實作的情況下,在 VB.NET 中建立 類別更容易,然後使用 .NET Reflector 或類似工具來將程式碼轉換成 C#。

連接字串和其他屬性應該設定為 Initialize 方法中的預設值。 (當提供者載入 runtime.) Initialize 方法的第二個參數屬於 System.Collections.Specialized.NameValueCollection 類型,而且是與 web.config 檔案中自訂提供者相關聯的 add > 元素參考 < 。 該專案看起來如下:

<system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="jForumCustomMembershipProvider" >
    <providers>
      <add name="jForumCustomMembershipProvider"
      type="jForumCustomMembershipProvider"
      requiresQuestionAndAnswer="true"
      connectionString="Provider=Microsoft.Jet.
        OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
        App_Data\Members.mdb;Persist Security
        Info=False"
        />
    </providers>
  </membership>
</system.web>

以下是 Initialize 方法的範例。

public override void Initialize(string name,
    System.Collections.Specialized.NameValueCollection config) {

    if (config["requiresQuestionAndAnswer"])
        _requiresQuestionAndAnswer = true;
    _connString = config["connectionString"];
    base.Initialize(name, config);
}

若要在使用者提交登入表單時驗證使用者,您必須使用 ValidateUser 方法。 當使用者按一下 [登入] 控制項中的 [登入] 按鈕時,就會引發這個方法。 您將將執行使用者查閱的程式碼放在此方法中。

如您所見,撰寫自己的成員資格提供者並不困難,因此可讓您擴充此功能 ASP.NET 2.0。