ClaimsAuthenticationManager、ClaimsAuthorizationManager 和 OriginalIssuer

ClaimsAuthenticationManager

使用 ClaimsAuthenticationManager,您可以执行声明转换,包括在 RP 应用程序收到从传入令牌中提取的声明之前添加、修改和删除这些声明。 它提供了一个进行声明身份验证的位置。 ASP.NET 和 WCF 应用程序均使用这一位置,在这里您会问:“我是否信任颁发者来提出这些声明?”

要截获传入的声明,请创建一个类,它是从 ClaimsAuthenticationManager 派生的,并实现了其唯一方法 Authenticate。 就在 RP 应用程序接收从令牌提取的声明之前,WIF 会调用此方法并传入 ClaimsIdentityCollection,该集合包含从传入令牌提取的声明。 您可以修改此集合,然后利用方法返回该集合。 接下来,RP 应用程序会收到修改的声明集合。

要使用 ClaimsAuthenticationManager,还必须将其添加到 RP 应用程序配置文件中,或者在 ServiceConfiguration 对象的 ClaimsAuthenticationManager 上设置它。 有关 ServiceConfiguration 对象的详细信息,请参阅配置

ClaimsAuthorizationManager

ClaimsAuthorizationManager 提供一个位置,在 RP 应用程序收到传入的请求之前批准或拒绝这些请求。 在这里您会问:“我是否允许请求者对此资源执行此操作?”

要截获传入的请求,请创建一个类,它是从 ClaimsAuthorizationManager 派生的,并实现了其唯一方法 CheckAccessAuthorizationContext 参数包含以下成员:

  1. Action:一个代表操作的 Claim 集合。

  2. Principal:请求者的 IClaimsPrincipal

  3. Resource:一个代表资源的 Claim 集合。

请注意,AuthorizationContext.ActionClaimsPrincipalPermission.Operation 对应,而不与 ClaimsPrincipalPermission.SecurityAction 对应。 AuthorizationContext.ResourceClaimsPrincipalPermission.Resource 对应。

要使用 ClaimsAuthorizationManager,还必须将其添加到 RP 应用程序配置文件中,或者在 ServiceConfiguration 对象的 ClaimsAuthorizationManager 上设置它。 有关 ServiceConfiguration 对象的详细信息,请参阅配置

请注意,对于 WCF 服务终结点,传递到 ClaimsAuthorizationManager 的资源通常是终结点 URI。 这同样适用于以下终结点:

  1. WCF 服务。

  2. 用 POST 方法调用的 REST 服务。

  3. 用 POST 方法调用的带有 ClaimsAuthorizationModule 的 ASP.NET 应用程序。

这不适用于以下终结点:

  1. 用 GET 方法调用的 REST 服务。

  2. 用 GET 方法调用的带有 ClaimsAuthorizationModule 的 ASP.NET 应用程序。

要根据终结点 URI 批准或拒绝请求,则不能执行严格的字符串比较,因为 URI 会随每个请求而变,具体取决于请求字符串查询参数。

另请注意,不应在异步回调方法中进行批准决策,因为不会针对这些方法调用 ClaimsAuthorizationManager。 您可以在 Beginxxx 方法中进行批准决策,而不是在异步回调或 Endxxx 方法中进行批准决策。

OriginalIssuer

如果需要使用依赖方应用程序 (RP) 根据最初颁发声明的 STS 进行策略决策,则可以使用 OriginalIssuer 属性。 此属性由颁发包含声明的令牌的安全令牌服务 (STS) 设置。

例如,假设您的 RP 从其信赖方 STS (RP-STS) 接收令牌。 RP-STS 自身信任多个标识提供方 STS (IP-STS)。 RP 信任其 RP-STS,引申的意思是它也信任 IP-STS。 不过,RP 必须根据令牌中包含的声明最初是由 RP-STS 还是一个 IP-STS 颁发来进行策略决策。 OriginalIssuer 属性可以帮助它做到这一点。

OriginalIssuer 属性的值无法进行加密验证。 因此,可以使用它来进行策略决策,但不应使用它来进行安全性决策。

备注

对于收到的所有声明,在颁发包含这些声明的其他令牌时,委派链中的 STS 必须保留 OriginalIssuer 的值。