如何:比较声明
Windows Communication Foundation (WCF) 中的标识模型基础结构用于执行授权检查。因此,一个常见的任务是将授权上下文中的声明与执行请求的操作或访问请求的资源所需的声明进行比较。本主题说明如何比较声明,包括内置和自定义声明类型。有关标识模型基础结构的更多信息,请参见使用标识模型管理声明和授权。
声明比较包括将一个声明的三个部分(类型、权限和资源)与另一个声明中的相同部分进行比较,以确定它们是否相等。例如,给定两个 Name
声明;
两个声明都将具有 Name 声明类型、PossessProperty 权限和字符串“someone”资源。由于声明的三个部分都相等,因此声明本身也是相等的。
内置的声明类型通过 Equals 方法进行比较。必要时使用特定于声明的比较代码。例如,给定以下两个用户主要名称 (UPN) 声明:
假定 example\someone
将同一个域用户标识为“someone@example.com”,则 Equals 方法中的比较代码返回 true。
还可以使用 Equals 方法比较自定义声明类型。但是,在声明的 Resource 属性返回的类型不是基元类型的情况下,只有当 Resource 属性返回的值依据 Equals 方法相等时,Equals 才会返回 true。当此情况不适用时,Resource 属性返回的自定义类型应该重写 Equals 和 GetHashCode 方法,以执行任何必要的自定义处理。
比较内置声明
- 给定 Claim 类的两个实例,使用 Equals 进行比较,如下面的代码所示。
比较具有基元资源类型的自定义声明
对于具有基元资源类型的自定义声明,可以按照内置声明那样的方式执行比较,如下面的代码所示。
对于具有基于结构或类的资源类型的自定义声明,资源类型应重写 Equals 方法。
首先检查 obj 参数是否为 空,如果是,则返回 false。
接下来调用 ReferenceEquals,将 this 和 obj 作为参数传递。如果它返回 true,则返回 true。
然后尝试将 obj 分配给一个类类型的局部变量。如果此操作失败,则引用为 空。在这种情况下返回 false。
执行将当前声明与提供的声明进行正确比较所需的自定义比较。
示例
下面的示例显示自定义声明的比较,其中声明资源是非基元类型。