授权是确定哪些实体有权更改、查看或其他访问计算机资源的过程。 例如,在企业中,只能允许经理访问其员工的文件。 Windows Communication Foundation (WCF) 支持两种执行授权处理的机制。 第一种机制使你能够使用现有的公共语言运行时 (CLR) 构造来控制授权。 第二种是基于声明的模型,称为 标识模型。 WCF 使用标识模型从传入消息创建声明;可以扩展标识模型类以支持自定义授权方案的新声明类型。 本主题概述了标识模型功能的主要编程概念,以及功能使用的最重要类的列表。
标识模型方案
以下情景表示标识模型的使用。
方案 1:支持标识、角色和组声明
用户向 Web 服务发送消息。 Web 服务的访问控制要求使用标识、角色或组。 消息发送方映射到一个角色或组的集中。 角色或组信息用于执行访问检查。
方案 2:支持多信息声明
用户向 Web 服务发送消息。 Web 服务的访问控制要求需要比标识、角色或组更丰富的模型。 Web 服务使用基于声明的丰富模型确定给定用户是否有权访问特定受保护资源。 例如,一个用户可能能够读取其他用户无权访问的特定信息,例如工资信息。
方案 3:映射完全不同的声明
用户向 Web 服务发送消息。 用户可以通过多种方式指定其凭据:X.509 证书、用户名令牌或 Kerberos 令牌。 无论用户凭据类型如何,Web 服务都需要以相同的方式执行访问控制检查。 如果随着时间的推移支持其他凭据类型,系统应相应地发展。
方案 4:确定访问多个资源的权限
Web 服务尝试访问多个资源。 该服务通过将与用户关联的声明与访问资源所需的声明进行比较来确定给定用户有权访问哪些受保护资源。
标识模型术语
以下列表定义了用于描述标识模型概念的关键术语。
授权策略
一组规则,用于将一组输入声明映射到一组输出声明。 对授权策略进行评估会将声明集添加到评估上下文,并随后添加到授权上下文。
授权上下文
一组声明集和零个或多个属性。 评估一个或多个授权策略的结果。
索赔
声明类型、权限和值的组合。
声明集
特定颁发者颁发的一组声明。
声明类型
一种声明。 标识模型 API 定义的声明是 ClaimType 类的属性。 系统提供的声明类型的示例包括Dns、Email、Hash、Name、Rsa、Sid、Spn、System、Thumbprint、Uri和X500DistinguishedName。
评估上下文
用于评估授权策略的上下文。 包含属性和声明集。 在评估完成后,成为授权上下文的基础。
身份声明
其权限为标识的声明。
发行人
一个声明集,它至少包含一个标识声明,并且被认为已颁发另一个声明集。
性能
与评估上下文或授权上下文关联的一组信息。
受保护的资源
系统中仅在首先满足某些要求的情况下才可以使用、访问或操作的资源。
正确
对于某个资源拥有的能力。 标识模型 API 定义的权限是类的属性 Rights 。 系统提供的权限示例有 Identity 和 PossessProperty。
价值
用以声明权限的信息。
申请
标识模型是基于声明的系统。 声明描述与系统中某个实体关联的功能,该实体通常为该系统中的某个用户。 可以将与给定实体关联的声明集视为键。 特定声明定义该键的形状,类似于用于在门中打开锁的物理键。 声明用于获取访问资源的权限。 通过将访问该资源所需的声明与尝试访问实体关联的声明进行比较来确定对给定受保护资源的访问。
声明是相对于特定值的权利的表达式。 权限可以是“读取”、“写入”或“执行”。值可以是数据库、文件、邮箱或属性。 索赔也有索赔类型。 声明类型和权限的组合提供用于指定针对该值的功能的机制。 例如,如果一个声明的类型为“File”,对值“Biography.doc”具有“Read”权限,则指示与此声明关联的实体具有读取 Biography.doc 文件的权限。一个声明的类型为“Name”,对值“Martin”具有“PossessProperty”权限,指示与这种声明关联的实体拥有值为“Martin”的 Name 属性。
尽管各种声明类型和权限被定义为标识模型的一部分,但系统是可扩展的,允许各种系统基于标识模型基础结构构建,根据需要定义其他声明类型和权限。
身份声明
一种特定权限是标识权限。 拥有此权限的声明对实体的标识进行声明。 例如,具有值 someone@example.com
和权限 Identity
的“用户主体名称”(UPN)类型的声明指示特定域中的特定标识。
系统标识声明
标识模型定义一个标识声明: System
。
System
标识声明指示实体是当前应用程序或系统。
声明集
表示标识的声明模型很重要,因为声明始终由系统中的某些实体发出,即使该实体最终是“自我”的概念。 声明以集合的形式组合在一起,每个集合都有一个发布者。 颁发者只是一个声明集。 这样一种递归关系最终必须结束,任何声明集都可以是其自己的颁发者。
下图显示了一个包含三个声明集的示例,其中一个声明集以另一个声明集为其颁发者,而那个声明集又以 System 声明集为其颁发者。 因此,声明集构成一个层次结构,该层次结构可能任意深度。
多个声明集具有相同的颁发声明集,如下图所示:
除了是自已的颁发者的声明集之外,标识模型绝不支持声明集形成循环。 因此,声明集 A 是由声明集 B 发出的,而声明集 B 又是由声明集 A 发出的情况永远无法出现。 而且,标识模型也绝不支持声明集具有多个颁发者。 如果两个或多个颁发者必须颁发一组给定的声明,则必须使用多个声明集,每个声明包含相同的声明,但颁发者不同。
声明的来源
声明可能来自各种来源。 声明的一个常见来源是用户提供的凭据,例如,作为发送到 Web 服务的消息的一部分。 系统验证此类声明,它们将成为与用户关联的一组声明的一部分。 其他系统组件也可能是声明的来源,包括但不限于作系统、网络堆栈、运行时环境或应用程序。 此外,远程服务也可能是声明的来源。
授权策略
在标识模型中,声明作为评估授权策略过程的一部分生成。 授权策略会检查现有(可能为空)的声明集,并可能根据已存在的声明和可用的信息添加额外的声明。 这提供了在声明之间进行映射的基础。 系统中是否存在声明会影响授权策略的行为,无论它是否添加其他声明。
例如,授权策略有权访问包含使用系统的各种实体的出生日期的数据库。 授权策略使用此信息将一个“Over18”声明添加到上下文。 请注意,这一超过18岁声明不会披露任何有关该实体的信息,仅披露该实体已超过18岁。 请注意,“Over18”声明的解释取决于理解该声明的语义。 添加声明的授权策略在某种程度上理解那些语义。 随后检查策略评估结果声明的代码也应理解这些语义。
给定的授权策略可能需要多次评估它,因为其他授权策略添加声明时,授权策略可能会添加更多声明。 标识模型设计为不断进行评估,直到任何有效的授权策略都不再向上下文中添加声明为止。 这种对授权策略的持续评估可防止要求强制实施有关授权策略的任何特定评估顺序;可以按任意顺序评估它们。 例如,如果策略 X 仅添加声明 Z(如果策略 A 已添加声明 B),则如果先评估 X,则最初不会添加声明 Z。随后,将计算 A 并添加声明 B。X 然后再次计算,这次将添加 Claim Z。
给定系统可能具有许多有效授权策略。
钥匙加工机
评估一组关联的授权策略就像使用创建密钥的计算机一样。 每个授权策略都会进行评估,并生成声明集,从而构建密钥的形状。 键的形状完成后,它可用于尝试打开一些锁。 密钥的形状存储在授权管理器创建的“授权上下文”中。
授权上下文
授权管理器会评估各种授权策略,结果是授权上下文(一组声明集和一些关联的属性)。 可以检查授权上下文以确定该上下文中存在哪些声明、这些各种声明之间的关系(例如颁发声明集),并最终将它们与访问资源必须满足的某些要求进行比较。
锁
如果授权上下文(即一组声明)是密钥,则访问特定受保护资源所需满足的要求构成该密钥必须匹配的锁。 鉴于系统的基于声明的性质,标识模型不会正式表示此类要求的方式,但它们涉及将授权上下文中的声明与一组必需的声明进行比较。
回顾
标识模型基于声明的概念。 声明以集的形式进行组合并在授权上下文中聚合。 授权上下文包含一组声明,是评估与授权管理器关联的一个或多个授权策略的结果。 可以检查这些声明集以确定是否符合访问要求。 下图显示了这些各种标识模型概念之间的关系。
WCF 和标识模型
WCF 使用标识模型基础结构作为执行授权的基础。 在 WCF 中,类 ServiceAuthorizationBehavior 允许将 授权 策略指定为服务的一部分。 此类授权策略称为 外部授权策略,它们可以根据本地策略或与远程服务交互来执行声明处理。 类表示 ServiceAuthorizationManager 的授权管理器将外部授权策略与识别各种凭据类型(令牌)的授权策略一起评估,并使用适用于传入消息的声明填充所谓的 授权上下文 。 授权上下文由 AuthorizationContext 类表示。
标识模型编程
下表描述了用于对标识模型扩展进行编程的对象模型。 这些类都存在于System.IdentityModel.Policy或System.IdentityModel.Claims命名空间中。
班级 | DESCRIPTION |
---|---|
授权组件 | 标识模型类实现了IAuthorizationComponent接口。 |
IAuthorizationComponent | 提供单个只读字符串属性的接口:ID。此属性的值对于实现此接口的系统中的每个实例都是唯一的。 |
AuthorizationContext | 一个 授权组件 ,其中包含一组 ClaimSet 具有零个或多个属性的实例;评估一个或多个授权策略的结果。 |
Claim | 声明类型、权限和值的组合。 权限和值部分受声明类型约束。 |
ClaimSet | 抽象基类。
Claim 实例的集合。 |
DefaultClaimSet | 一个密封类。
ClaimSet 类的实现。 |
EvaluationContext | 抽象基类。 在策略评估期间传递给授权策略。 |
IAuthorizationPolicy | 从IAuthorizationComponent 派生并由授权策略类实现的接口。 |
Rights | 一个包含预定义正确值的静态类。 |
以下类也用于 Identity Model 编程,但未在 System.IdentityModel.Policy 或 System.IdentityModel.Claims 命名空间中找到。
班级 | DESCRIPTION |
---|---|
ServiceAuthorizationManager | 一个类,提供一种方法(CheckAccessCore),为服务中的每项操作执行基于声明的授权检查。 必须从此类派生,并重写此方法。 |
ServiceAuthorizationBehavior | 一个密封类,提供与授权有关的服务行为的各种相关属性。 |
ServiceSecurityContext | 为当前运行(或即将运行)的操作提供安全上下文(包括授权上下文)的类。 此类的实例是 OperationContext 的一部分。 |
重要成员
以下成员通常用于创建新声明类型。
成员 | DESCRIPTION |
---|---|
CheckAccessCore | 派生类实现此方法,以便在服务中运行操作之前执行基于声明的访问检查。 在做出访问检查决定时,可以检查提供的 OperationContext 中(或其他位置)的所有信息。 如果 CheckAccessCore 返回 true ,则会授予访问权限,并允许该作运行。 如果 CheckAccessCore 返回 false ,则拒绝访问,并且操作不会运行。 有关示例,请参阅 “如何:为服务创建自定义授权管理器”。 |
ServiceAuthorizationManager | 返回服务的 ServiceAuthorizationManager。 ServiceAuthorizationManager 负责做出授权决定。 |
ExternalAuthorizationPolicies | 为服务指定的自定义授权策略的集合。 除了评估与传入消息中的凭据关联的策略外,还评估这些策略。 |