共用方式為


使用表單驗證驗證使用者 (C#)

Microsoft 提供

瞭解如何使用 [Authorize] 屬性來密碼保護 MVC 應用程式中的特定頁面。 您將瞭解如何使用網站管理工具來建立和管理使用者和角色。 您也會瞭解如何設定使用者帳戶和角色資訊的儲存位置。

本教學課程的目標是說明如何使用表單驗證來密碼保護 ASP.NET MVC 應用程式中的檢視。 您將瞭解如何使用網站管理工具來建立使用者和角色。 您也會瞭解如何防止未經授權的使用者叫用控制器動作。 最後,您將瞭解如何設定儲存使用者名稱和密碼的位置。

使用網站管理工具

在我們執行任何其他動作之前,我們應該先建立一些使用者和角色。 建立新使用者和角色最簡單的方式,是利用 Visual Studio 2008 網站管理工具。 您可以選取 [專案,ASP.NET 設定] 選單選項來啟動此工具。 或者,您可以按一下顯示於 [方案總管] 視窗頂端的鎚子圖示 (見圖 1),以啟動網站管理工具。

圖 1 – 啟動網站管理工具

clip_image002

在網站管理工具內,您可以選取 [安全性] 索引標籤來建立新的使用者和角色。按一下 [建立使用者] 連結,以建立名為 Stephen 的新使用者 (請參閱圖 2)。 為 Stephen 使用者提供您想使用的任何密碼 (例如 secret)。

圖 2 – 建立新使用者

clip_image004

您必須先啟用角色並定義一或多個角色,以建立新的角色。 按一下 [啟用角色] 連結來啟用角色。 接下來,按一下 [建立或管理角色] 連結來建立名為 Administrators 的角色 (請參閱圖 3)。

圖 3 – 建立新角色

clip_image006

最後,按一下 [建立使用者] 連結,並在建立 Sally 時選取 [系統管理員],建立名為 Sally 的新使用者,並將 Sally 與 Administrators 角色建立關聯 (請參閱圖 4)。

圖 4 – 將使用者新增至角色

clip_image008

當一切都完成,您應該有兩個新的使用者,名為 Stephen 和 Sally。 您也應該有名為 Administrators 的新角色。 Sally 是系統管理員角色的成員,Stephen 不是。

需要授權

您可以藉由將 [Authorize] 屬性新增至動作,要求使用者在叫用控制器動作之前先進行驗證。 您可以將 [Authorize] 屬性套用至個別控制器動作,也可以將此屬性套用至整個控制器類別。

例如,清單 1 中的控制器會公開名為 CompanySecrets() 的動作。 由於此動作是以 [Authorize] 屬性裝飾,因此除非已驗證使用者,否則無法叫用此動作。

清單 1 – Controllers\HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        
        [Authorize]
        public ActionResult CompanySecrets()
        {
            return View();
        }
    }
}

如果您在瀏覽器的網址列中輸入 URL /Home/CompanySecrets 來叫用 CompanySecrets() 動作,而您不是已驗證的使用者,則會自動將您重新導向至 [登入] 檢視 (請參閱圖 5)。

圖 5 – [登入] 檢視

clip_image010

您可以使用 [登入] 檢視來輸入您的使用者名稱和密碼。 如果您不是已註冊的使用者,您可以按下 [註冊] 連結以瀏覽至 [註冊] 檢視 (請參閱圖 6)。 您可以使用 [註冊] 檢視來建立新的使用者帳戶。

圖 6 – [註冊] 檢視

clip_image012

成功登入之後,您可以看到 CompanySecrets 檢視 (請參閱圖 7)。 根據預設,您將會繼續登入,直到您關閉瀏覽器視窗為止。

圖 7 – CompanySecrets 檢視

clip_image014

依使用者名稱或使用者角色授權

您可以使用 [Authorize] 屬性,將控制器動作的存取限制為特定使用者集或特定使用者角色集。 例如,清單 2 中修改的主控制器包含兩個名為 StephenSecrets() 和 AdministratorSecrets() 的新動作。

清單 2 – Controllers\HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        
        [Authorize]
        public ActionResult CompanySecrets()
        {
            return View();
        }


        [Authorize(Users="Stephen")]
        public ActionResult StephenSecrets()
        {
            return View();
        }


        [Authorize(Roles = "Administrators")]
        public ActionResult AdministratorSecrets()
        {
            return View();
        }

    }
}

只有使用者名稱為 Stephen 的使用者可以叫用 StephenSecrets() 動作。 所有其他使用者都會重新導向至 [登入] 檢視。 [Users] 屬性接受以逗號分隔的使用者帳戶名稱清單。

只有具備系統管理員角色的使用者可以叫用 AdministratorSecrets() 動作。 例如,因為 Sally 是系統管理員群組的成員,因此她可以叫用 AdministratorSecrets() 動作。 所有其他使用者都會重新導向至 [登入] 檢視。 [Roles] 屬性接受以逗號分隔的角色名稱清單。

設定驗證

此時,您可能會想知道要儲存使用者帳戶和角色資訊的位置。 根據預設,資訊會儲存在名為 ASPNETDB.mdf 的 SQL Express 資料庫中,該資料庫位於 MVC 應用程式的 App_Data 資料夾中。 當您開始使用成員資格時,ASP.NET 架構會自動產生此資料庫。

若要在 [方案總管] 視窗中看到 ASPNETDB.mdf 資料庫,您必須先選取 [專案,顯示所有檔案] 功能表選項。

開發應用程式時,使用預設 SQL Express 資料庫就沒問題。 不過,建議您不要使用生產應用程式的預設 ASPNETDB.mdf 資料庫。 在此情況下,您可以完成下列兩個步驟來變更使用者帳戶資訊的儲存位置:

  1. 將 Application Services 資料庫物件新增至生產資料庫 - 將應用程式連接字串變更為指向生產資料庫

第一個步驟是將所有必要的資料庫物件 (表格和預存程序) 新增至生產資料庫。 將這些物件新增至新資料庫最簡單的方式,就是利用 SQL Server 安裝精靈 ASP.NET (請參閱圖 8)。 您可以從 Microsoft Visual Studio 2008 程式群組開啟 Visual Studio 2008 命令提示字元,並從命令提示字元執行下列命令,以啟動此工具:

aspnet_regsql

圖 8 – ASP.NET SQL Server 安裝精靈

clip_image016

ASP.NET SQL Server 安裝精靈可讓您選取網路上的 SQL Server 資料庫,並安裝 ASP.NET 應用程式服務所需的所有資料庫物件。 資料庫伺服器不需要位於本機機器上。

注意

如果您不想使用 ASP.NET SQL Server 安裝精靈,則可以在下列資料夾中找到用於新增應用程式服務資料庫物件的 SQL 指令碼:

C:\Windows\Microsoft.NET\Framework\v2.0.50727

建立必要的資料庫物件之後,您必須修改 MVC 應用程式所使用的資料庫連結。 修改 Web 設定 (web.config) 檔案中的 ApplicationServices 連接字串,使其指向生產資料庫。 例如,清單 3 中修改的連接會指向名為 MyProductionDB 的資料庫 (原始 ApplicationServices 連接字串已加上註解)。

清單 3 – Web.config

<connectionStrings>
    <!--<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>-->
  <add name="ApplicationServices" connectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=MyProductionDB" />
</connectionStrings>

設定資料庫權限

如果您使用整合式安全性來連線到資料庫,則必須將正確的 Windows 使用者帳戶新增為資料庫的登入。 正確的帳戶取決於您使用 ASP.NET 程式開發伺服器還是 Internet Information Services 做為網頁伺服器。 正確的使用者帳戶也取決於您的作業系統。

如果您使用 ASP.NET 程式開發伺服器 (Visual Studio 使用的預設網頁伺服器),則您的應用程式會在 Windows 使用者帳戶的內容中執行。 在此情況下,您必須將 Windows 使用者帳戶新增為資料庫伺服器登入。

或者,如果您使用 Internet Information Services,則必須將 ASPNET 帳戶或 NT AUTHORITY/NETWORK SERVICE 帳戶新增為資料庫伺服器登入。 如果您使用 Windows XP,請將 ASPNET 帳戶新增為資料庫的登入。 如果您使用較新的作業系統,例如 Windows Vista 或 Windows Server 2008,請新增 NT AUTHORITY/NETWORK SERVICE 帳戶做為資料庫登入。

您可以使用 Microsoft SQL Server Management Studio,將新的使用者帳戶新增至資料庫 (請參閱圖 9)。

圖 9 – 建立新的 Microsoft SQL Server 登入

clip_image018

建立必要的登入之後,您必須將登入對應至具有正確資料庫角色的資料庫使用者。 按兩下登入,然後選取 [使用者對應] 索引標籤。選取一或多個應用程式服務資料庫角色。 例如,若要驗證使用者,您必須啟用 aspnet_Membership_BasicAccess 資料庫角色。 若要建立新的使用者,您必須啟用 aspnet_Membership_FullAccess 資料庫角色 (請參閱圖 10)。

圖 10 – 新增 Application Services 資料庫角色

clip_image020

摘要

在本教學課程中,您已瞭解如何在建置 ASP.NET MVC 應用程式時使用表單驗證。 首先,您已瞭解如何利用網站管理工具來建立新的使用者和角色。 接著,您已瞭解如何使用 [Authorize] 屬性來防止未經授權的使用者叫用控制器動作。 最後,您也已瞭解如何設定 MVC 應用程式,以將使用者和角色資訊儲存在生產資料庫中。