我甚至不确定这是可行的,但我无法在任何kbs,帮助或文档中找到明确的答案。
我有一个通过ACS保护的WebAPI。应用程序使用服务标识通过ACS使用我的WebAPI进行身份验证以允许访问。我想要做的是提出服务标识的声明,以识别个人身份。例如,服务标识A表示类型和标识,并且服务标识B为相同的声明类型提供不同的值,然后我的WebAPI可以根据声明值授权特定的呼叫。
目前,我通过规则组使用输出声明实现了此功能,声明值通过ACS门户设置,但规则组适用于访问依赖应用程序(My WebAPI)的所有服务身份,我需要的是获得服务每个身份都有不同的声明价值。
由于所有通信都是服务,我计划使用ACS,而不是其他身份提供商,如Live / Microsoft Account或Google。但是目前我唯一可以得出的结论是实现我自己的自定义STS以提供声明值。
我希望我已清楚地解释了我的情况,任何人都可以提供帮助,我如何为各个服务标识设置声明值,还是应该以不同的方式进行此操作?
由于
安德鲁
答案 0 :(得分:2)
IIRC应用程序创建自己的令牌并使用cert / symm密钥对其进行签名 - 该令牌中的声明随后成为规则引擎中的输入...
..但已经有一段时间了;)
答案 1 :(得分:1)
在我离开办公室过圣诞节/新年假期之前,我设法解决了这个问题,并想知道我是如何解决这个问题给其他可能觉得有用的人。
我退出了问题并以新的视角回到了它。由于我的应用程序基于服务标识进行身份验证,并且身份验证是在调用我的服务的服务之间进行身份验证,因此不会有大量的服务标识进行身份验证。因此,根据我的要求,我可以利用规则组根据提供的索赔提供索赔。
我的所有Windows Azure访问控制服务标识都提供了nameidentifier声明(http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name标识符),因此对于每个新的服务标识,我在ACS门户中创建了一个新的规则组:
创建新规则组后,我选择添加规则,如下所示。我选择了InputClaim Issuer是访问控制服务,因为ACS正在提供令牌以通过我的服务进行身份验证。接下来选择我期望接收的输入声明类型以及我在If语句中检查的输入声明类型。因此,在下面的示例中,如果提供的nameidentifier声明具有StackOverflow值(我期望的服务标识的名称),那么我希望返回带有ACS返回的令牌的UK输出声明。我还添加了额外的规则,以便在需要的地方添加更多输出声明。这允许我返回相应服务标识的正确声明和值。
最后,我进入了依赖方应用程序列表并选择了我的依赖方应用程序(我的服务)并选择了我创建的新规则组。
这种方法解决了我的问题,使我现在可以从提供给我的休息服务的令牌中读取声明,并根据提供的值做出决定。我开始寻找一种更复杂的方法,当我退后一步看清楚要求时,我能够通过核心ACS功能实现我的要求。希望这有助于其他有类似要求的人。