.NET Framework 使用者作業基本概念
更新:2007 年 11 月
.NET Framework 會在 System.Security.Principal 命名空間中提供以角色為基礎的安全性實作,您可以將它用於授權與驗證應用程式中的使用者。本主題將討論如何在 .NET Framework 中使用應用程式授權,以及如何建立用於表示使用者的 IIdentity 和 IPrincipal 物件。
IIdentity 會封裝已驗證的使用者。IPrincipal 是使用者識別 (Identity) 及該使用者所具備之任何角色的組合。您可以在 System.Security.Principal 命名空間中使用預先定義的識別與主要類別,或是建立實作介面的類別,藉以加入自訂驗證 (Authentication)。
若要使用這些介面,您必須使介面名稱完全符合規定,或是在受到影響之來源程式碼檔案的開頭處包含 Imports 陳述式 (Statement),藉以匯入適當的命名空間。如需詳細資訊,請參閱 Imports 陳述式 (.NET 命名空間和型別)。
在 .NET Framework 應用程式中使用以角色為基礎的安全性
每一個應用程式執行緒都會有相關聯的主體物件 (可以透過 CurrentPrincipal 屬性存取),此物件表示使用者的安全性內容,並代表該使用者執行程式碼。主體物件會封裝使用者的使用者安全性內容 (或 Identity) 物件。使用兩個可以分開驗證 (在 Identity 物件中) 和授權 (在主體物件中) 的物件。
Identity 物件必須實作 IIdentity 介面。Identity 物件代表特定使用者,並且會在 IIdentity 介面要求時公開下列屬性:Name、IsAuthenticated 和 AuthenticationType。Identity 物件通常會有執行使用者驗證的其他私用成員。
主體物件必須實作 IPrincipal 介面。主體物件會在 IPrincipal 介面要求時公開下列成員,藉以封裝使用者的安全性內容:IsInRole 方法 (此方法會執行授權) 以及 Identity 屬性 (此屬性會提供使用者之 Identity 物件的存取權)。
使用識別
.NET Framework 會提供四種實作 IIdentity 介面的類別:
每一種類別都可以讓您使用不同的使用者身分。若要為使用 Windows 驗證的應用程式存取目前的 WindowsIdentity 物件,請使用 WindowsIdentity 類別的靜態 GetCurrent 方法。您可以呼叫 My.User.InitializeWithWindowsUser 方法,藉以設定目前執行緒的主體。
也可以在自己的自訂類別中實作 IIdentity 介面,藉以建立自訂的識別類別。如需建立自訂識別的詳細資訊,請參閱逐步解說:實作自訂驗證和授權。
使用主體
.NET Framework 提供用於連結使用者角色與識別的 IPrincipal 介面。如果應用程式會執行授權,則它應該使用會實作 IPrincipal 的物件。例如,WindowsIdentity 與 GenericIdentity 類別會提供 IPrincipal 的內建實作。此外,還可以根據 IPrincipal 建立自己的主要類別。
將物件指派給執行緒的 CurrentPrincipal 屬性或 My.User.CurrentPrincipal 屬性,藉以連結目前的執行緒與 IPrincipal 物件。然後可以測試使用者是否為特定角色的成員,藉以執行授權檢查。若要這樣做,您可以使用主體的 IsInRole 方法。
ASP.NET 應用程式會以與其他 .NET Framework 應用程式不同的方式,處理 IPrincipal 物件。ASP.NET 會在沒有狀態 (Stateless) 的 HTTP 通訊協定上建立工作階段的外觀。做為此工作階段的一部分,代表使用者的 IPrincipal 物件可以從 HttpContext 物件的 User 屬性供執行使用者要求的所有程式碼使用。Common Language Runtime 會以 Global.asax 檔案之 OnAuthenticate 事件後的 User 值,自動更新 CurrentPrincipal。ASP.NET 應用程式通常會使用 User 屬性,執行授權檢查。
注意事項: |
---|
若以手動方式變更 User,則會針對在相同 HTTP 內容中執行的所有執行緒自動更新 CurrentPrincipal 屬性。然而,變更 CurrentPrincipal 不會影響 User 屬性。它只會影響針對要求之其他部分所選擇的執行緒。 |
在 ASP.NET 應用程式中,My.User.CurrentPrincipal 屬性會更新 User 屬性。
如需建立您自己之 IPrincipal 型別的詳細資訊,請參閱逐步解說:實作自訂驗證和授權。
授與使用權限以使用 IIdentity 與 IPrincipal 物件
因為 IIdentity 物件可以使用機密的使用者相關資訊,因此授與使用權限以使用這些物件時應該多加留意。因為應用程式的授權功能是依據它目前的主體,所以您應該保護應用程式目前的 IPrincipal 物件,使它不受變更。
.NET Framework 會查詢這些作業是否具備存取程式碼的安全性權限,藉以提供此項保護措施。使用程式碼存取安全性原則工具 (Caspol.exe),將 SecurityPermissionAttribute.ControlPrincipal 存取權限授與給需要管理這些物件的應用程式。
根據預設,所有在本機安裝的應用程式都具有此存取權限,這是因為它們是在 FullTrust 存取權限集合下所執行。
若要執行下列方法,則需要具備 ControlPrincipal 存取權限: