使用 Windows 驗證驗證使用者 (C#)
由 Microsoft 提供
瞭解如何在 MVC 應用程式的內容中使用 Windows 驗證。 您將瞭解如何在應用程式的 Web 設定檔內啟用 Windows 驗證,以及如何使用 IIS 設定驗證。 最後,您將瞭解如何使用 [Authorize] 屬性來限制特定 Windows 使用者或群組對控制器動作的存取。
本教學課程的目標是說明如何利用 Internet Information Services 內建的安全性功能來保護 MVC 應用程式中的檢視。 您將瞭解如何只允許特定 Windows 使用者或屬於特定 Windows 群組成員的使用者叫用控制器動作。
當您建置內部公司網站 (內部網路網站),而且希望使用者在存取網站時能夠使用其標準 Windows 使用者名稱和密碼時,使用 Windows 驗證是合理的做法。 如果您要建置對外的網站 (網際網路網站),請考慮改用表單驗證。
啟用 Windows 驗證
當您建立新的 ASP.NET MVC 應用程式時,預設不會啟用 Windows 驗證。 表單驗證是針對 MVC 應用程式啟用的預設驗證類型。 您必須修改 MVC 應用程式的 Web 設定 (web.config) 檔案,以啟用 Windows 驗證。 尋找 [<驗證>] 區段,並將其修改為使用 Windows 而非表單驗證,如下所示:
<authentication mode="Windows">
</authentication>
當您啟用 Windows 驗證時,網頁伺服器會負責驗證使用者。 一般而言,在建立和部署 ASP.NET MVC 應用程式時,您會使用兩種不同類型的 Web 伺服器。
首先,在開發 MVC 應用程式時,您會使用 Visual Studio 隨附的 ASP.NET Development Web Server。 根據預設,ASP.NET 開發網頁伺服器會在目前 Windows 帳戶 (您用來登入 Windows 的任何帳戶) 的內容中執行所有頁面。
ASP.NET 開發網頁伺服器也支援 NTLM 驗證。 您可以在 [方案總管] 視窗中以滑鼠右鍵按下專案名稱,然後選取 [屬性],以啟用 NTLM 驗證。 接下來,選取 [Web] 索引標籤並核取 [NTLM] 核取方塊 (請參閱圖 1)。
圖 1 – 為 ASP.NET 開發網頁伺服器啟用 NTLM 驗證
針對生產 Web 應用程式,您一方面會使用 IIS 做為網頁伺服器。 IIS 支援數種類型的驗證,包括:
- 基本身份驗證 – 定義為 HTTP 1.0 通訊協定的一部分。 透過網際網路以純文本傳送使用者名稱和密碼 (Base64 編碼)。 - 摘要式驗證 – 透過網際網路傳送密碼的雜湊,而不是密碼本身。 - 整合式 Windows (NTLM) 驗證 – 使用 Windows 在內部網路環境中使用的最佳驗證類型。 - 憑證驗證 – 使用用戶端憑證啟用驗證。 憑證會對應至 Windows 使用者帳戶。
注意
如需這些不同類型驗證的詳細概觀,請參閱 https://msdn.microsoft.com/library/aa292114(VS.71).aspx。
您可以使用 Internet Information Services 管理員來啟用特定類型的驗證。 請注意,每個作業系統都有無法使用的驗證類型。 此外,如果您使用 IIS 7.0 搭配 Windows Vista,則必須在 Internet Information Services 管理員中顯示不同類型的 Windows 驗證。 依序開啟 [控制台]、[程式]、[程式和功能],然後開啟或關閉 Windows 功能,然後展開 Internet Information Services 節點 (請參閱圖 2)。
圖 2 – 啟用 Windows IIS 功能
使用 Internet Information Services,您可以啟用或停用不同類型的驗證。 例如,圖 3 說明在使用 IIS 7.0 時停用匿名驗證和啟用整合式 Windows (NTLM) 驗證。
圖 3 – 啟用整合式 Windows 驗證
授權 Windows 使用者和群組
啟用 Windows 驗證之後,您可以使用 [Authorize] 屬性來控制控制器或控制器動作的存取權。 這個屬性可以套用至整個 MVC 控制器或特定控制器動作。
例如,清單 1 中的 Home 控制器會公開三個名為 Index()、CompanySecrets() 和 StephenSecrets() 的動作。 任何人都可以叫用 Index() 動作。 不過,只有 Windows 本機管理員群組的成員可以叫用 CompanySecrets() 動作。 最後,只有名為 Stephen 的 Windows 網域使用者 (在 Redmond 網域中) 可以叫用 StephenSecrets() 動作。
清單 1 – 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(Roles = "Managers")]
public ActionResult CompanySecrets()
{
return View();
}
[Authorize(Users="redmond\\swalther")]
public ActionResult StephenSecrets()
{
return View();
}
}
}
注意
由於 Windows 使用者帳戶控制 (UAC),使用 Windows Vista 或 Windows Server 2008 時,本機系統管理員群組的行為會與其他群組不同。 除非您修改計算機的 UAC 設定,否則 [Authorize] 屬性無法正確辨識本機系統管理員群組的成員。
當您嘗試叫用控制器動作而不使用正確的許可權時,所發生的確切情況取決於啟用的驗證類型。 根據預設,使用 ASP.NET 程式開發伺服器時,您只會看到空白頁面。 頁面會顯示「401 未獲授權」的 HTTP 回應狀態。
另一方面,如果您使用 IIS 並停用匿名驗證,同時啟用基本身份驗證,則每次您要求受保護的頁面時,都會繼續收到登入對話方塊提示 (請參閱圖 4)。
圖 4 – 基本身份驗證登入對話方塊
摘要
本教學課程說明了如何在 ASP.NET MVC 應用程式的內容中使用 Windows 驗證。 您已瞭解如何在應用程式的 Web 設定檔內啟用 Windows 驗證,以及如何使用 IIS 設定驗證。 最後,您也已瞭解如何使用 [Authorize] 屬性來限制特定 Windows 使用者或群組對控制器動作的存取。