文章編號: 306590 - 上次校閱: 2007年10月29日 - 版次: 3.8

INFO:ASP.NET 安全性概觀

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
本文參照下列 Microsoft .NET Framework 類別庫 (Class Library) 的命名空間:
  • System.Web.Security
  • System.Web.Principal

在此頁中

全部展開 | 全部摺疊

結論

本文件將簡介 ASP.NET 安全性。

如需其他 ASP.NET 概觀,請參閱下列「Microsoft 知識庫」中的文件:
305140? (http://support.microsoft.com/kb/305140/ ) INFO:ASP.NET 藍圖

其他相關資訊

ASP.NET 可讓您更能夠控制如何為您的應用程式執行安全性。ASP.NET 安全性會配合 Microsoft Internet Information Services (IIS) 安全性一起運作,而且其中包含了可用來實作 ASP.NET 安全性模型的驗證和授權服務。 ASP.NET 也包含了角色安全性功能,供您同時使用於 Microsoft Windows 和非 Windows 使用者帳戶。

本文分為下列兩節內容:

配合要求的安全性流程

下面步驟會大略說明用戶端提出要求時的事件順序:
  1. 用戶端向位在 IIS 伺服器中的 .aspx 網頁提出要求。
  2. 用戶端的憑證傳遞到 IIS。
  3. IIS 會驗證該用戶端,並將驗證過的權杖和該用戶端的要求一起轉送到 ASP.NET 工作者處理序。
  4. ASP.NET 會根據 IIS 傳入的驗證權杖和 Web 應用程式的設定值,決定是否要在處理此要求的執行緒上模擬使用者。Microsoft 動態伺服器網頁 (ASP) 和 ASP.NET 的最大差別,就是 ASP.NET 已預設成不模擬已驗證的使用者。如果要啟用模擬,您必須在 Web.config 檔案中,將識別區段的 impersonate 屬性設為 true
如需有關安全性流程的詳細資訊,請參閱 .NET Framework Software Development Kit (SDK) 文件中的下列主題:
ASP.NET 資料流程 (英文)
http://msdn2.microsoft.com/en-us/library/xa68twcb(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/xa68twcb(vs.71).aspx)
如需有關在 ASP.NET 進行模擬的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
306158? (http://support.microsoft.com/kb/306158/ ) 如何在 ASP.NET 應用程式中實作模擬

相關設定值

IIS 會在 IIS Metabase 中維護安全性相關設定值。然而,ASP.NET 會在「可延伸標記語言」(Extensible Markup Language,XML) 檔案中維護安全性 (和其他功能) 設定值。 雖然從安全性角度來看,這樣通常會簡化應用程式的部署工作,但是您的應用程式所採用的安全性模型,必須透過其設定檔案 (Web.config) 取得 IIS Metabase 和 ASP.NET 應用程式的正確設定。

下列是和 ASP.NET 安全性相關的設定區段:

驗證

您可以透過驗證處理序來取得例如使用者名稱和密碼等識別憑證,並根據某些授權來驗證這些憑證。

ASP.NET 會提供四種驗證提供者:

表單驗證

表單驗證系統會將還未驗證的使用者,重新導向到「超文字標記語言」(Hypertext Markup Language,HTML) 表單,供使用者在其中輸入憑證。使用者在提供憑證並傳送表單之後,應用程式就會驗證要求,接著系統會以 Cookie 方式發出授權票證。這個 Cookie 會包含可用來重新取得識別碼的憑證或是金鑰。此瀏覽器之後所發出的要求,都會自動包含這個 Cookie。

如需有關表單驗證的詳細資訊,請參閱 .NET Framework SDK 文件中的下列主題:
表單驗證提供者 (英文)
http://msdn2.microsoft.com/en-us/library/9wff0kyh(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/9wff0kyh(vs.71).aspx)
如需有關在 ASP.NET 進行表單驗證的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
301240? (http://support.microsoft.com/kb/301240/ ) 如何在 ASP.NET 應用程架構中使用 C# .NET 實作表單型驗證

Windows 驗證

進行 Windows 驗證時將由 IIS 執行驗證,而且驗證權杖會轉送到 ASP.NET 工作者處理序。使用 Windows 驗證的優點,在於只需要撰寫少量程式碼。您可以先使用 Windows 驗證來模擬 IIS 要驗證的 Windows 使用者帳戶,再將要求傳送到 ASP.NET。

如需有關 Windows 驗證的詳細資訊,請參閱 .NET Framework SDK 文件中的下列主題:
WindowsAuthenticationModule 提供者 (英文)
http://msdn2.microsoft.com/en-us/library/907hb5w9(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/907hb5w9(vs.71).aspx)

Passport 驗證

Passport 驗證是一種由 Microsoft 提供的集中式驗證服務,可提供成員網站的單一登入和核心設定檔服務。 通常您會在需要使用跨多網域單一登入功能時,使用 Passport 驗證。

如需有關 Passport 驗證的詳細資訊,請參閱 .NET Framework SDK 文件中的下列主題:
Passport 驗證提供者 (英文)
http://msdn2.microsoft.com/en-us/library/f8e50t0f(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/f8e50t0f(vs.71).aspx)

預設驗證

當您不希望在 Web 應用程式中執行任何安全性時,就可以使用預設驗證;這種安全性提供者會要求匿名存取。 在所有驗證提供者中,預設驗證可以為應用程式提供最大效能。您也可以在使用自訂的安全性模組時,使用這種驗證提供者。

授權

授權處理序會確認經過驗證的使用者,是否可以存取所要求的資源。

ASP.NET 會提供下列授權提供者:

FileAuthorization

FileAuthorizationModule 類別會執行檔案授權,而且在使用 Windows 驗證時會是啟用狀態。FileAuthorizationModule 會執行檢查 Windows「存取控制清單」(Access Control List,ACL),以決定使用者是否可以取得存取權限。

UrlAuthorization

UrlAuthorizationModule 類別會執行「統一資源定位器」(Uniform Resource Locator,URL) 授權,以便根據 URI 命名空間來控制授權。URI 命名空間和 NTFS 權限所使用的實體資料夾和檔案路徑,可能完全不同。

UrlAuthorizationModule 會實作正面和負面的授權邏輯判斷;也就是說,您可以使用此模組選擇性地允許或拒絕使用者、角色 (例如,管理員、測試人員和系統管理員) 和指令動詞 (例如,GET 和 POST) 來存取 URI 命名空間的任一部分。

如需有關在 ASP.NET 進行授權的詳細資訊,請參閱 .NET Framework SDK 文件中的下列主題:
ASP.NET 授權 (英文)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetauthorization.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetauthorization.asp)

角色安全性

ASP.NET 中的角色安全性和 Microsoft COM+ 與 Microsoft Transaction Server (MTS) 使用的角色安全性很類似,不過其中還是有些重要差異。ASP.NET 中的角色安全性不限用於 Windows 帳戶和群組。例如,如果已經啟用 Windows 驗證和模擬功能,使用者的識別碼就會是 Windows 識別碼 (User.Identity.Name = "Domain\username")。您可以檢查特定角色的成員資格識別碼,以及依據結果來限制存取權限。例如:

Visual Basic .NET 程式碼
 If User.IsInRole("BUILTIN\Administrators") Then    Response.Write("You are an Admin") Else If User.IsInRole("BUILTIN\Users") then    Response.Write("You are a User") Else    Response.Write("Invalid user") End if 				
Visual C# .NET 程式碼
 if ( User.IsInRole("BUILTIN\\Administrators"))    Response.Write("You are an Admin"); else if (User.IsInRole("BUILTIN\\Users"))    Response.Write("You are a User"); else    Response.Write("Invalid user"); 				
使用表單驗證時,並不會為經過驗證的使用者指派角色;您必須設計程式來執行這個動作。如果要指派角色給經過驗證的使用者,請使用驗證模組 (在這個範例中是指表單驗證模組) 中的 OnAuthenticate 事件來建立新的 GenericPrincipal 物件,並將它指派給 HttpContext 的 User 屬性。下面程式碼將說明這個範例:

Visual Basic .NET 程式碼
Public Sub Application_AuthenticateRequest(s As Object, e As EventArgs)
   If (Not(HttpContext.Current.User Is Nothing)) Then
      If HttpContext.Current.User.Identity.AuthenticationType = "Forms" Then
         Dim id as System.Web.Security.FormsIdentity = HttpContext.Current.User.Identity
         Dim myRoles(3) As String
         myRoles(0)= "managers"
         myRoles(1)= "testers"
         myRoles(2)= "developers"
         HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles) 
      End If
   End If
End Sub
				
Visual C# .NET 程式碼
public void Application_AuthenticateRequest(Object s, EventArgs e)      
{
   if (HttpContext.Current.User != null)
   {
      if (HttpContext.Current.User.Identity.AuthenticationType == "Forms" ) 
      {
         System.Web.Security.FormsIdentity id = HttpContext.Current.User.Identity;
         String[] myRoles = new String[3];
         myRoles[0]= "managers";
         myRoles[1]= "testers";
         myRoles[2]= "developers";
         HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);
      }
   }
} 
				
如果要檢查使用者是否已指派為特定角色,同時要根據結果來限制其存取權限,請在 .aspx 頁面中使用下面這段程式碼 (或類似程式碼):

Visual Basic .NET 程式碼
If User.IsInRole("managers") Then
   Response.Write("You are a Manager")
Else If  User.IsInRole("testers") Then
   Response.Write("You are a Tester")
Else If User.IsInRole("developers") Then
   Response.Write("You are a Developer")
End if
				
Visual C# .NET 程式碼
if (User.IsInRole("managers"))
   Response.Write("You are a Manager");
else if (User.IsInRole("testers"))
   Response.Write("You are a Tester");
else if (User.IsInRole("developers"))
   Response.Write("You are a Developer");
				
如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
306238? (http://support.microsoft.com/kb/306238/ ) How To Implement Role-Based Security with Forms-Based Authentication in Your ASP.NET Application by Using Visual Basic .NET
如需有關角色安全性的詳細資訊,請參閱 .NET Framework SDK 文件中的下列主題:
角色安全性 (英文)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconrole-basedsecurity.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconrole-basedsecurity.asp)

?考

如需有關 ASP.NET 安全性指南的詳細資訊,請參閱下列 MSDN 白皮書:
在 ASP.NET 中進行驗證:.NET 安全性指南 (英文)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx (http://msdn2.microsoft.com/en-us/library/ms978378.aspx)
如需有關 ASP.NET 的一般相關資訊,請造訪下列 MSDN 新聞群組:
microsoft.public.dotnet.framework.aspnet (http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409)
如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
311094? (http://support.microsoft.com/kb/311094/ ) FIX:"ConfigurationException" Error Message When Impersonated Accounts Read Configuration
306359? (http://support.microsoft.com/kb/306359/ ) PRB:Request.ServerVariables("LOGON_USER") Returns Empty String in ASP.NET
313091? (http://support.microsoft.com/kb/313091/ ) How to create keys by using Visual Basic .NET for use in Forms authentication
313116? (http://support.microsoft.com/kb/313116/ ) PRB:Forms Authentication Requests Are Not Directed to loginUrl Page
如需詳細資訊,請參閱下列叢書:
Reilly, Douglas J. Designing Microsoft ASP.NET Applications (http://go.microsoft.com/fwlink/?LinkId=8362) .Microsoft Press, 2001.

Esposito, Dino.Building Web Solutions with ASP.NET and ADO.NET (http://search.barnesandnoble.com/booksearch/isbnInquiry.asp?userid=2Z24O3LOY0&isbn=0735613486&itm=4) .Microsoft Press, 2001.

這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
關鍵字:?
kbproductlink kbarttyperoadmap kbconfig kbinfo kbsecurity kbweb KB306590
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。