1

我什至不确定这是否可行,但我无法在任何 kb、帮助或文档中找到明确的答案。

我有一个通过 ACS 保护的 WebAPI。应用程序使用服务身份通过 ACS 和我的 WebAPI 进行身份验证以允许访问。我想做的是为服务身份提出声明以识别个人身份。例如,服务标识 A 提供类型和 ID,服务标识 B 为相同的声明类型提供不同的值,然后我的 WebAPI 可以根据声明值授权特定的调用。

目前,我通过使用输出声明和通过 ACS 门户设置声明值的规则组实现了这一点,但是规则组应用于访问依赖应用程序(我的 WebAPI)的所有服务身份,我需要的是让每个服务身份都具有不同的索赔价值。

由于所有通信都是服务到服务,因此我计划使用 ACS 而不是其他身份提供商,例如 Live/Microsoft Account 或 Google。然而,目前我能得出的唯一结论是实施我自己的自定义 STS 来提供声明值。

我希望我已经清楚地解释了我的场景,任何人都可以提供帮助,我如何为单个服务身份设置声明值,或者我应该以不同的方式这样做?

谢谢

安德鲁

4

2 回答 2

2

IIRC 应用程序创建自己的令牌并使用 cert/symm 密钥对其进行签名 - 该令牌中的声明然后成为规则引擎中的输入......

..但已经有一段时间了;)

于 2012-12-21T15:07:54.943 回答
1

在我离开办公室过圣诞节/新年假期之前,我设法解决了这个问题,并想说明我是如何为其他可能觉得有用的人解决这个问题的。

我从这个问题中退后一步,以全新的视角重新审视它。由于我的应用程序基于服务身份进行身份验证,并且身份验证在调用我的服务的服务之间进行,因此不会有大量服务身份需要进行身份验证。因此,对于我的要求,我能够利用规则组根据提供的声明提供声明。

我所有的 Windows Azure 访问控制服务标识都提出了一个名称标识符声明(http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name标识符),因此对于每个新的服务标识,我都创建了一个新规则ACS 门户中的组:

创建新的 ACS 规则组

创建此新规则组后,我选择添加如下规则。我选择 InputClaim Issuer 是访问控制服务,因为 ACS 正在提供令牌以对我的服务进行身份验证。接下来选择我希望收到的输入声明类型,并且我在 If 语句中检查它。因此,在下面的示例中,如果提供的 nameidentifier 声明的值为 StackOverflow(我期望的服务标识的名称),那么我希望使用 ACS 返回的令牌返回值为 UK 的 Country 输出声明。我还添加了额外的规则,以便在需要时添加更多的输出声明。这使我能够为相应的服务标识返回正确的声明和值。

添加 ACS 声明规则

最后,我进入我的依赖方应用程序列表并选择了我的依赖方应用程序(我的服务)并选择了我创建的新规则组。

为依赖方应用程序选择规则组

这种方法解决了我的问题,使我现在能够从提供给我的休息服务的令牌中读取声明,并根据提供的值做出决定。我开始寻找一种更复杂的方法,当我退后一步并清楚地查看需求时,我发现我能够通过核心 ACS 功能实现我的需求。希望这可以帮助其他有类似要求的人。

于 2013-01-03T15:56:20.853 回答