主体和标识对象

注释

本文适用于 Windows。

有关 ASP.NET Core 的信息,请参阅 ASP.NET Core Security

托管代码可以通过IPrincipal对象来识别主体的身份或角色,该对象包含对IIdentity对象的引用。 将标识和主体对象与熟悉的概念(如用户和组帐户)进行比较可能很有帮助。 在大多数网络环境中,用户帐户代表人员或程序,而组帐户表示某些类别的用户及其拥有的权限。 同样,.NET 标识对象表示用户,而角色表示成员身份和安全上下文。 在 .NET 中,主体对象封装标识对象和角色。 .NET 应用程序根据主体的标识或角色成员资格(后者更常见)来向主体授予权限。

标识对象

标识对象封装有关要验证的用户或实体的信息。 在最基本的级别,标识对象包含名称和身份验证类型。 该名称可以是用户名或 Windows 帐户的名称,而身份验证类型可以是受支持的登录协议,例如 Kerberos V5 或自定义值。 .NET 定义一个 GenericIdentity 对象,该对象可用于大多数自定义登录方案,以及一个更专用 WindowsIdentity 的对象,当希望应用程序依赖 Windows 身份验证时,可以使用该对象。 此外,还可以定义自己的标识类来封装自定义用户信息。

IIdentity 接口定义用于访问名称和身份验证类型的属性,例如 Kerberos V5 或 NTLM。 所有 标识 类都实现 IIdentity 接口。 标识对象与当前正在执行的线程所在的 Windows 进程令牌之间没有必需的关系。 但是,如果 Identity 对象是 WindowsIdentity 对象,则假定标识表示 Windows 安全令牌。

主要对象

主体对象表示运行代码的安全上下文。 实现基于角色的安全性的应用程序基于与主体对象关联的角色来授予权限。 与标识对象类似,.NET 提供一个 GenericPrincipal 对象和一个 WindowsPrincipal 对象。 还可以定义自己的自定义主体类。

IPrincipal 接口定义用于访问关联的 Identity 对象的属性,以及用于确定 主体 对象标识的用户是否是给定角色的成员的方法。 所有 主体 类都实现 IPrincipal 接口以及所需的任何其他属性和方法。 例如,公共语言运行时提供 WindowsPrincipal 类,该类实现将组成员身份映射到角色的其他功能。

主体对象绑定到应用程序域 () 内的调用上下文 (CallContext) 对象。AppDomain 默认调用上下文始终使用每个新的 AppDomain 创建,因此始终有一个可用于接受 Principal 对象的调用上下文。 创建新线程时,还会为该线程创建 CallContext 对象。 主体对象引用会自动从创建线程复制到新线程的 CallContext。 如果运行时无法确定哪个 Principal 对象属于该线程的创建者,它将遵循 主体标识 对象创建的默认策略。

可配置的应用程序域特定策略定义用于确定要与新应用程序域关联的 Principal 对象的类型的规则。 如果安全策略允许,运行时可以创建 主体标识 对象,这些对象反映与当前执行线程相关联的操作系统令牌。 默认情况下,运行时使用表示未经身份验证的用户的 主体标识 对象。 在代码尝试访问这些对象之前,运行时不会创建这些默认 主体标识 对象。

创建应用程序域的受信任代码可以设置控制默认 主体标识 对象的构造的应用程序域策略。 此应用程序域特定的策略适用于该应用程序域中的所有执行线程。 非托管的受信任主机本质上能够设置此策略,但设置此策略的托管代码必须具有 System.Security.Permissions.SecurityPermission 控制域策略的权限。

在不同的应用程序域之间、但在同一进程内(因此在同一台计算机上)传输 Principal 对象时,远程处理基础结构将与调用方上下文相关联的、对 Principal 对象的引用复制到被调用方的上下文中。

另请参阅