Managed 程式代碼可以透過 IPrincipal 物件來發現主體的身分或角色,該物件包含對 IIdentity 物件的參考。 將身分識別和主體對象與像使用者和群組帳戶這類熟悉的概念進行比較,可能會更有幫助。 在大部分的網路環境中,用戶帳戶代表人員或程式,而組帳戶代表特定類別的使用者和他們擁有的許可權。 同樣地,.NET 身分識別物件代表使用者,而角色代表成員資格和安全性內容。 在 .NET 中,主體物件會封裝身分識別物件和角色。 .NET 應用程式會根據主體的身分識別或角色成員資格(較常見)來授予許可權。
識別物件
身分識別物件會封裝所驗證之用戶或實體的相關信息。 在最基本的層級,身分識別物件包含名稱和驗證類型。 此名稱可以是使用者的名稱或 Windows 帳戶的名稱,而驗證類型可以是支援的登入通訊協定,例如 Kerberos V5 或自定義值。 .NET 定義 GenericIdentity 可用於大部分自定義登入案例的物件,以及當您希望應用程式依賴 Windows 驗證時可以使用的更特製 WindowsIdentity 化物件。 此外,您可以定義自己的身分識別類別,以封裝自定義用戶資訊。
介面 IIdentity 會定義用來存取名稱和驗證類型的屬性,例如 Kerberos V5 或 NTLM。 所有 Identity 類別都會實作 IIdentity 介面。 Identity 對象與線程目前正在執行的 Windows 進程令牌之間沒有必要的關聯性。 不過,如果 Identity 對像是 WindowsIdentity 物件,則會假設身分識別代表 Windows 安全性令牌。
主體物件
主體物件代表執行程式代碼的安全性內容。 根據與主體對象相關聯的角色,實作角色型安全性的應用程式會授與許可權。 與識別物件類似,.NET 會提供 GenericPrincipal 物件和 WindowsPrincipal 物件。 您也可以定義自己的自訂主體類別。
介面 IPrincipal 會定義屬性來存取相關聯的 Identity 物件,以及判斷 Principal 物件所識別的使用者是否為指定角色的成員的方法。 所有 主體 類別都會實作 IPrincipal 介面,以及必要的任何其他屬性和方法。 例如,Common Language Runtime 提供 WindowsPrincipal 類別,其會實作將群組成員資格對應至角色的其他功能。
Principal 物件系結至應用程式域 () 內的呼叫內容 (CallContextAppDomain) 物件。 預設的呼叫內容會隨著每個新的 AppDomain 建立,因此總是會有呼叫內容可供接受 Principal 物件。 建立新的線程時,也會為線程建立 CallContext 物件。 Principal 對象參考會自動從建立線程複製到新線程的 CallContext。 如果運行時間無法判斷哪個 Principal 對象屬於線程的建立者,它會遵循 主體 和 身分識別 物件建立的默認原則。
可設定的應用程式域特定原則會定義規則,以決定要與新應用程式域產生關聯的 Principal 物件類型。 當安全策略允許時,執行階段可以建立 主體 和 身分識別 物件,以反映與目前執行緒相關聯的作業系統權杖。 根據預設,運行時間會使用代表未驗證用戶的 主體 和 身分識別 物件。 運行時間不會建立這些預設 主體 和 身分識別 物件,直到程式代碼嘗試存取它們為止。
建立應用程式域的信任程式代碼可以設定應用程式域原則,以控制預設 主體 和 身分識別 物件的建構。 此應用程式域特定原則會套用至該應用程式域中的所有執行線程。 非受控、受信任的主機本身就有能力設定此原則,但要設定此原則的受管理代碼必須具有控制網域原則的權限。
當在同一個進程中(因此在同一台計算機上)跨應用程式域傳輸 Principal 物件時,遠端處理基礎結構會將與呼叫者上下文相關聯的 Principal 物件引用複製到被呼叫者的上下文。