主体和标识对象
托管代码可以通过 IPrincipal 对象发现主体的身份或角色,该对象包含对 IIdentity 对象的引用。 将标识对象和主体对象同用户帐户与组帐户这样常见的概念进行比较,可能会有所帮助。 在大多数网络环境中,用户帐户表示人员或程序,而组帐户表示特定类别的用户及其拥有的权限。 同样,.NET 中的标识对象表示用户,而角色表示成员资格与安全性上下文。 在 .NET 中,主体对象同时封装标识对象和角色。 .NET 应用程序根据主体的标识或角色成员资格(后者更常见)来向主体授予权限。
标识对象
标识对象封装有关正在验证的用户或实体的信息。 在最基本的级别上,标识对象包含名称和身份验证类型。 名称可以是用户名或 Windows 帐户名,而身份验证类型可以是所支持的登录协议(如 Kerberos V5)或自定义值。 .NET 定义了一个 GenericIdentity 对象和一个更专用的 WindowsIdentity 对象,前者可用于大多数自定义登录方案,如果你希望你的应用程序依赖 Windows 身份验证,则可以使用后一个对象。 此外,还可以定义自己的标识类来封装自定义用户信息。
IIdentity 口定义用于访问名称和身份验证类型(例如 Kerberos V5 或 NTLM)的属性。 所有 Identity 类均实现 IIdentity 接口。 Identity 对象与当前执行线程所用的 Windows 进程标记之间不需要有什么关系。 但是,如果 Identity 对象是 WindowsIdentity 对象,则假定标识表示 Windows NT 安全标记。
主体对象
主体对象表示代码运行时所在的安全性上下文。 实现基于角色的安全性的应用程序基于与主体对象关联的角色来授予权限。 与标识对象类似,.NET 提供了一个 GenericPrincipal 对象和一个 WindowsPrincipal 对象。 你还可以定义自己的自定义主体类。
IPrincipal 接口定义一个属性和一个方法,前者用于访问关联的 Identity 对象,后者用于确定 Principal 对象所标识的用户是否为给定角色的成员。 所有 Principal 类都实现 IPrincipal 接口以及任何必需的附加属性和方法。 例如,公共语言运行时提供 WindowsPrincipal 类,该类实现将组成员资格映射到角色的附加功能。
主体对象绑定到应用程序域 (AppDomain) 内的调用上下文 (CallContext) 对象。 默认的调用上下文始终用每个新的 AppDomain 创建,因此始终存在可用于接受 Principal 对象的调用上下文。 创建新线程的同时也为该线程创建 CallContext 对象。 Principal 对象引用从正在创建的线程自动复制到新线程的 CallContext 中。 如果运行时无法确定哪个Principal 对象属于线程的创建者,则会遵循 Principal 和 Identity 对象创建的默认策略。
可配置的应用程序域特定策略定义了一些规则,用以决定同新的应用程序域关联的 Principal 对象类型。 在安全策略的允许范围内,运行时可创建 Principal 和 Identity 对象来反射与当前执行线程关联的操作系统标记。 默认情况下,运行时使用 Principal 和 Identity 对象表示未经身份验证的用户。 运行时不创建这些默认的 Principal 和 Identity 对象,除非代码尝试访问它们。
创建应用程序域的受信任代码可设置应用程序域策略,以控制默认 Principal 和 Identity 对象的构造。 此应用程序域特定策略适用于该应用程序域中的所有执行线程。 非托管的受信任主机本身就具有设置此策略的能力,但托管代码必须具有控制域策略的 System.Security.Permissions.SecurityPermission 才能设置此策略。
在不同的应用程序域之间、但在同一进程内(因此在同一台计算机上)传输 Principal 对象时,远程处理基础结构将与调用方上下文相关联的、对 Principal 对象的引用复制到被调用方的上下文中。