共用方式為


設定使用應用程式服務的網站 (C#)

作者:Scott Mitchell

注意

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

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

ASP.NET 2.0 版引進了一系列應用程式服務,這些服務是.NET Framework的一部分,並可作為一套建置組塊服務,可用來將豐富的功能新增至 Web 應用程式。 本教學課程會探索如何在生產環境中設定網站,以使用應用程式服務,並解決在生產環境中管理使用者帳戶和角色的常見問題。

簡介

ASP.NET 2.0 版引進了一系列應用程式服務,這些服務是.NET Framework的一部分,可作為一套建置組塊服務,可用來將豐富的功能新增至 Web 應用程式。 應用程式服務包括:

  • 成員資格 - 用來建立和管理使用者帳戶的 API。
  • 角色 - 將使用者分類為群組的 API。
  • 設定檔 - 用來儲存自訂使用者特定內容的 API。
  • 網站地圖 - 用來以階層形式定義網站邏輯結構的 API,然後可透過導覽控制項顯示,例如功能表和階層連結。
  • 個人化 - 用來維護自訂喜好設定的 API,最常與 WebParts搭配使用。
  • 健康情況監視 - 用於監視執行中 Web 應用程式的效能、安全性、錯誤和其他系統健康情況計量的 API。

應用程式服務 API 不會系結至特定實作。 相反地,您會指示應用程式服務使用特定 提供者,而該提供者會使用特定技術來實作服務。 裝載于 Web 主控公司的網際網路型 Web 應用程式最常使用的提供者,就是使用SQL Server資料庫實作的提供者。 例如,是成員資格 API 的提供者, SqlMembershipProvider 會將使用者帳戶資訊儲存在 Microsoft SQL Server 資料庫中。

使用應用程式服務和SQL Server提供者,會在部署應用程式時增加一些挑戰。 對於入門,必須在開發和生產資料庫上正確建立應用程式服務資料庫物件,並適當地初始化。 此外,還需要進行重要的組態設定。

注意

應用程式服務 API 是使用 提供者模型所設計,這是一種設計模式,可讓 API 在執行時間提供實作詳細資料。 .NET Framework隨附許多可使用的應用程式服務提供者,例如 SqlMembershipProviderSqlRoleProvider ,這些是使用SQL Server資料庫實作之成員資格和角色 API 的提供者。 您也可以建立自訂提供者並外掛程式。 事實上,Book Reviews Web 應用程式已經包含網站地圖 API 的自訂提供者 () ReviewSiteMapProvider ,它會從資料庫中的資料 GenresBooks 資料表建構網站地圖。

本教學課程一開始會探討如何擴充 Book Reviews Web 應用程式,以使用成員資格和角色 API。 然後,它會逐步解說部署 Web 應用程式,以搭配SQL Server資料庫實作使用應用程式服務,並藉由解決在生產環境中管理使用者帳戶和角色的常見問題。

書籍評論應用程式的更新

在過去幾個教學課程中,Book Reviews Web 應用程式已從靜態網站更新為動態、資料導向的 Web 應用程式,其中包含一組管理內容類型和評論的管理頁面。 不過,此管理區段目前並未受到保護 - 任何知道 (或猜測的使用者,) 系統管理頁面 URL 都可以在網站建立、編輯或刪除評論。 保護網站特定部分的常見方式是實作使用者帳戶,然後使用 URL 授權規則來限制特定使用者或角色的存取。 本教學課程中可供下載的書籍評論 Web 應用程式支援使用者帳戶和角色。 它具有名為 管理員 的單一角色,而且只有此角色中的使用者可以存取管理頁面。

注意

我在 Book Reviews Web 應用程式中建立了三個使用者帳戶:Scott、Jisun 和 Alice。 這三個使用者都有相同的密碼:密碼!Scott 和 Jisun 處於管理員角色,Alice 不是。 匿名使用者仍然可以存取網站的非系統管理頁面。 也就是說,除非您想要管理網站,否則您不需要登入,在此情況下,您必須以管理員角色中的使用者身分登入。

Book Reviews 應用程式的主版頁面已更新,以包含已驗證和匿名使用者的不同使用者介面。 如果匿名使用者造訪網站,她會在右上角看到登入連結。 已驗證的使用者會看到訊息「歡迎返回、 使用者名稱!」和登出的連結。另外還有一個登入頁面 (~/Login.aspx) ,其中包含提供使用者介面和邏輯來驗證訪客的登入 Web 控制項。 只有系統管理員可以建立新的帳戶。 (有頁面可用來在 folder.) 中 ~/Admin 建立和管理使用者帳戶

設定成員資格和角色 API

Book Reviews Web 應用程式會使用成員資格和角色 API 來支援使用者帳戶,並將這些使用者分組為角色 (也就是管理員角色) 。 使用 SqlMembershipProviderSqlRoleProvider 提供者類別,因為我們想要將帳戶和角色資訊儲存在SQL Server資料庫中。

注意

本教學課程不適合在設定 Web 應用程式以支援成員資格和角色 API 時進行詳細檢查。 如需這些 API 的徹底探討,以及設定網站以使用這些 API 所需的步驟,請閱讀我的 網站安全性教學課程

若要搭配SQL Server資料庫使用應用程式服務,您必須先將這些提供者所使用的資料庫物件新增至您想要儲存使用者帳戶和角色資訊的資料庫。 這些必要資料庫物件包含各種資料表、檢視和預存程式。 除非另有指定, SqlMembershipProvider 否則 和 SqlRoleProvider 提供者類別會使用位於應用程式 App_Data 資料夾的 ASPNETDB SQL Server Express Edition 資料庫;如果這類資料庫不存在,則會在這些提供者在執行時間使用必要的資料庫物件自動建立。

在儲存網站應用程式特定資料的相同資料庫中建立應用程式服務資料庫物件通常很理想。 .NET Framework隨附名為 aspnet_regsql.exe 的工具,可在指定的資料庫上安裝資料庫物件。 我已繼續使用此工具,將這些物件新增至 Reviews.mdfApp_Data 資料夾中 (開發資料庫) 。 我們將在本教學課程稍後將這些物件新增至生產資料庫時,瞭解如何使用此工具。

如果您將應用程式服務資料庫物件新增至資料庫, ASPNETDB 您不需要自訂 SqlMembershipProviderSqlRoleProvider 提供者類別組態,才能使用適當的資料庫。 若要自訂 Membership 提供者,請在 中的 Web.config 區段中新增< 成員資格 > 專案<system.web> ;請使用< roleManager > 元素來設定 Roles 提供者。 下列程式碼片段取自書籍評論應用程式的 , Web.config 並顯示成員資格和角色 API 的設定。 請注意,這兩者都會分別註冊新的提供者 和 ReviewMembershipReviewRole ,且分別使用 SqlMembershipProviderSqlRoleProvider 提供者。

<configuration>
    <system.web>
        ...

        <membership defaultProvider="ReviewMembership">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlMembershipProvider" 
                     name="ReviewMembership" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </membership>

        <roleManager enabled="true" defaultProvider="ReviewRole">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlRoleProvider" 
                     name="ReviewRole" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </roleManager>

        ...
    </system.web>
</configuration>

檔案 Web.config<authentication> 元素也已設定為支援表單型驗證。

<configuration>
    <system.web>
        ...

        <authentication mode="Forms" />

        ...
    </system.web>
</configuration>

限制系統管理頁面的存取

ASP.NET 可讓您透過使用者或角色的 URL 授權 功能,輕鬆地授與或拒絕特定檔案或資料夾的存取權。 (我們在IIS 與 ASP.NET 開發伺服器的核心差異中簡短討論 URL 授權教學課程,並示範 IIS 和 ASP.NET 開發伺服器如何針對靜態與動態內容套用 URL 授權規則。) 因為我們想要禁止存取 ~/Admin 資料夾,但管理員角色中的使用者除外,我們必須將 URL 授權規則新增至此資料夾。 具體而言,URL 授權規則必須允許使用者管理員角色,並拒絕所有其他使用者。 這可藉由使用下列內容將檔案新增 Web.config~/Admin 資料夾來完成:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>

如需 ASP.NET URL 授權功能的詳細資訊,以及如何使用它來拼出使用者和角色的授權規則,請務必閱讀我的網站安全性教學課程中的使用者型授權角色型授權教學課程

部署使用應用程式服務的 Web 應用程式

部署使用應用程式服務的網站,以及將應用程式服務資訊儲存在資料庫中的提供者時,必須在生產資料庫上建立應用程式服務所需的資料庫物件。 一開始生產資料庫不包含這些物件,因此當應用程式第一次部署 (,或在應用程式服務新增) 之後第一次部署應用程式時,您必須採取額外的步驟,以在生產資料庫上取得這些必要資料庫物件。

如果您想要將開發環境中建立的使用者帳戶複寫到生產環境,部署使用應用程式服務的網站時,可能會發生另一項挑戰。 視成員資格和角色設定而定,即使您成功將開發環境中建立的使用者帳戶複製到生產資料庫,這些使用者也無法在生產環境中登入 Web 應用程式。 我們將探討此問題的原因,並討論如何防止發生此問題。

ASP.NET 隨附良好的 網站管理工具, (可從 Visual Studio 啟動的 WSAT) ,並允許透過 Web 型介面來管理使用者帳戶、角色和授權規則。 不幸的是,WSAT 僅適用于本機網站,這表示它無法用於在生產環境中遠端系統管理 Web 應用程式的使用者帳戶、角色和授權規則。 我們將探討從生產網站實作類似 WSAT 的行為的不同方式。

使用 aspnet_regsql.exe 新增資料庫物件

部署資料庫教學課程示範如何將資料表和資料從開發資料庫複製到生產資料庫,而且這些技術當然可用來將應用程式服務資料庫物件複製到生產資料庫。 另一個選項是 aspnet_regsql.exe 工具,它會從資料庫新增或移除應用程式服務資料庫物件。

注意

此工具 aspnet_regsql.exe 會在指定的資料庫上建立資料庫物件。 它不會將這些資料庫物件中的資料從開發資料庫移轉至生產資料庫。 如果您表示將開發資料庫中的使用者帳戶和角色資訊複製到生產資料庫,請使用 部署資料庫 教學課程中涵蓋的技術。

讓我們看看如何使用 工具,將資料庫物件新增至生產資料庫 aspnet_regsql.exe 。 從開啟 Windows 檔案總管並流覽至電腦上的 .NET Framework 2.0 版目錄,%WINDIR%\ Microsoft.NET\Framework\v2.0.50727 開始。 您應該會在該 aspnet_regsql.exe 處找到工具。 此工具可從命令列使用,但它也包含圖形化使用者介面;按兩下 aspnet_regsql.exe 檔案以啟動其圖形化元件。

此工具一開始會顯示說明其用途的啟動顯示畫面。 按 [下一步] 前進到 [選取安裝選項] 畫面,如圖 1 所示。 您可以從這裡選擇新增應用程式服務資料庫物件,或從資料庫中移除它們。 由於我們想要將這些物件新增至生產資料庫,請選取 [設定應用程式服務的SQL Server] 選項,然後按 [下一步]。

選擇 [為應用程式服務設定SQL Server

圖 1:選擇設定 Application Services SQL Server (按一下以檢視大小完整的映射)

在 [選取伺服器和資料庫] 畫面中,會提示資訊連線到資料庫。 輸入資料庫伺服器、安全性認證,以及 Web 主控公司提供給您的資料庫名稱,然後按 [下一步]。

注意

輸入資料庫伺服器和認證之後,當您展開資料庫下拉式清單時,可能會收到錯誤。 此工具 aspnet_regsql.exesysdatabases 查詢系統資料表以擷取伺服器上的資料庫清單,但有些 Web 主控公司會鎖定其資料庫伺服器,以便無法公開取得此資訊。 如果您收到此錯誤,可以直接在下拉式清單中輸入資料庫名稱。

使用您的資料庫連線資訊提供工具

圖 2:使用資料庫連線資訊提供工具, (按一下即可檢視大小完整的映射)

後續畫面摘要說明即將發生的動作,也就是將應用程式服務資料庫物件新增至指定的資料庫。 按 [下一步] 完成此動作。 幾分鐘後,會顯示最後一個畫面,指出資料庫物件已新增 (請參閱圖 3) 。

成功!Application Services 資料庫物件已新增至生產資料庫

圖 3:成功! 應用程式服務資料庫物件已新增至生產資料庫 (按一下即可檢視完整大小的映射)

若要確認應用程式服務資料庫物件已成功新增至生產資料庫,請開啟SQL Server Management Studio並聯機到您的生產資料庫。 如圖 4 所示,您現在應該會看到資料庫中的應用程式服務資料庫資料表、 aspnet_Applicationsaspnet_Membershipaspnet_Users 等等。

確認資料庫物件已新增至生產資料庫

圖 4:確認資料庫物件已新增至生產資料庫 (按一下以檢視完整大小的映射)

您只需要 aspnet_regsql.exe 在第一次部署 Web 應用程式時,或在開始使用應用程式服務之後第一次使用此工具。 一旦這些資料庫物件位於生產資料庫上,就不需要重新新增或修改。

將使用者帳戶從開發複製到生產環境

使用 SqlMembershipProviderSqlRoleProvider 提供者類別將應用程式服務資訊儲存在SQL Server資料庫中時,使用者帳戶和角色資訊會儲存在各種資料庫資料表中,包括 aspnet_Usersaspnet_Membershipaspnet_Rolesaspnet_UsersInRoles 等等。 如果您在開發環境中建立使用者帳戶,則可以從適用的資料庫資料表複製對應的記錄,在生產環境中複寫這些使用者帳戶。 如果您使用 [資料庫發佈精靈] 來部署應用程式服務資料庫物件,您可能也已選取複製記錄,這會導致開發中建立的使用者帳戶也會在生產環境上。 但是,視您的組態設定而定,您可能會發現在開發中建立帳戶並複製到生產環境的使用者無法從生產網站登入。 為何會這樣呢?

SqlMembershipProviderSqlRoleProvider 提供者類別的設計目的是讓單一資料庫可以做為多個應用程式的使用者存放區,其中每個應用程式理論上可以讓使用者具有相同名稱的重迭使用者名稱和角色。 為了允許此彈性,資料庫會維護資料表中的 aspnet_Applications 應用程式清單,而且每個使用者都與其中一個應用程式相關聯。 具體而言,資料表有一個 ApplicationId 資料行, aspnet_Users 會將每個使用者系結至資料表中的 aspnet_Applications 記錄。

除了資料 ApplicationId 行之外, aspnet_Applications 資料表也包含一個 ApplicationName 資料行,其為應用程式提供更易記的名稱。 當網站嘗試使用使用者帳戶時,例如從登入頁面驗證使用者的認證,它必須告訴 SqlMembershipProvider 類別要使用的應用程式。 它通常會藉由提供應用程式名稱來執行這項作業,而此值來自 中的 Web.config 提供者組態,特別是透過 applicationName 屬性。

但是,如果未在 中 Web.config 指定 屬性, applicationName 會發生什麼事? 在這種情況下,成員資格系統會使用應用程式根路徑做為 applicationName 值。 applicationName如果未在 中 Web.config 明確設定 屬性,則開發環境和生產環境可能會使用不同的應用程式根目錄,因此會與應用程式服務中的不同應用程式名稱相關聯。 如果發生這類不相符的情況,則在開發環境中建立的使用者將具有 ApplicationId 與生產環境值不相符 ApplicationId 的值。 最終結果是這些使用者將無法登入。

注意

如果您在這種情況中發現 - 使用者帳戶複製到生產環境且值不相符 ApplicationId ,您可以撰寫查詢,以將這些不正確的 ApplicationId 值更新為 ApplicationId 生產環境所使用的 。 更新之後,在開發環境上建立其帳戶的使用者現在可以在生產環境中登入 Web 應用程式。

好消息是,您可以採取一個簡單的步驟,以確保這兩個環境使用相同的 ApplicationId 環境, 明確設定 applicationName 中所有應用程式服務提供者的屬性 Web.config 。 我在 和 元素中 <membership> 明確將 屬性設定 applicationName 為 「BookReviews」,因為此程式碼片段所示 Web.config<roleManager>

<membership defaultProvider="ReviewMembership">
    <providers>
        <clear />

        <add type="System.Web.Security.SqlMembershipProvider" 
             name="ReviewMembership" 
             connectionStringName="ReviewsConnectionString" 
             applicationName="BookReviews" />
    </providers>
</membership>

如需設定 applicationName 屬性及其背後的原理的詳細資訊,請參閱 Scott Guthrie 部落格文章: 設定 ASP.NET 成員資格和其他提供者時,一律設定 applicationName 屬性

在生產環境中管理使用者帳戶

ASP.NET 網站管理工具 (WSAT) 可讓您輕鬆地建立和管理使用者帳戶、定義及套用角色,以及拼出使用者和角色型授權規則。 您可以從 Visual Studio 啟動 WSAT,方法是移至 [方案總管],然後按一下 [ASP.NET 組態] 圖示,或移至 [網站或專案] 功能表,然後選取 [ASP.NET 組態] 功能表項目。 不幸的是,WSAT 只能與本機網站搭配使用。 因此,您無法從工作站使用 WSAT 來管理生產環境中的網站。

好消息是,WSAT 所提供的所有功能都可以透過成員資格和角色 API 以程式設計方式使用;此外,許多 WSAT 畫面都會使用標準 ASP.NET 登入相關控制項。 簡單來說,您可以將 ASP.NET 網頁新增至提供必要管理功能的網站。

回想一下,先前的教學課程已更新 Book Reviews Web 應用程式以包含 ~/Admin 資料夾,而且此資料夾已設定為只允許管理員角色中的使用者。 我已將頁面新增至該資料夾, CreateAccount.aspx 系統管理員可從該資料夾中建立新的使用者帳戶。 此頁面使用 CreateUserWizard 控制項來顯示用來建立新使用者帳戶的使用者介面和後端邏輯。 此外,我自訂控制項以包含 CheckBox,提示新使用者是否也應該新增至管理員角色, (請參閱圖 5) 。 使用一些工作,您可以建置一組自訂頁面,以實作 WSAT 所提供的使用者和角色管理相關工作。

注意

如需使用成員資格和角色 API 以及登入相關 ASP.NET Web 控制項的詳細資訊,請務必閱讀我的 網站安全性教學課程。 如需自訂 CreateUserWizard 控制項的詳細資訊,請參閱 建立使用者帳戶儲存其他使用者資訊 教學課程,或參閱 Erich Peterson 文章: 自訂 CreateUserWizard 控制項

系統管理員可以建立新的使用者帳戶

圖 5:系統管理員可以建立新的使用者帳戶 (按一下以檢視大小完整的映射)

如果您需要 WSAT 的完整功能,請參閱 推出您自己的網站管理工具,其中作者 Dan Clem 會逐步解說建置自訂 WSAT 之類的工具的程式。 Dan 在 C#) 中共用其應用程式的原始程式碼 (,並提供將它新增至託管網站的逐步指示。

摘要

部署使用應用程式服務資料庫實作的 Web 應用程式時,您必須先確定生產資料庫具有必要的資料庫物件。 您可以使用 部署資料庫 教學課程中討論的技術來新增這些物件;或者,您可以使用 aspnet_regsql.exe 此工具,如本教學課程中所見。 我們接觸的其他挑戰是以同步處理開發和生產環境中所使用的應用程式名稱為中心, (如果您想要在開發環境中建立的使用者和角色,在生產環境中建立的使用者和角色在生產環境) 和技術上有效,這很重要。

快樂的程式設計!

深入閱讀

如需本教學課程中討論之主題的詳細資訊,請參閱下列資源: