使用API Management Policy Expressions是否可以将可变长度数组输出到一组XML元素?
我使用Policy Fragments和<validate-jwt>
作为示例,我们的大多数策略只需要一个<audience>
,但也有一些边缘情况需要多个<audience>
。受众不支持claim
这样的separator
属性,并且希望避免克隆片段以支持第二或第三受众。
不幸的是,我看不出如何实现一个整洁的剃刀式foreach来构建XML(验证错误:Error in element 'validate-jwt' on line 17, column 2: The element 'audiences' cannot contain text. List of possible elements expected: 'audience'.
)-达到了一个策略,在该策略下 * 工作 *,但有足够的代码气味,必须有一个更干净的方法。
Messy POC示例
<set-variable name="apiAudiences" value="api://abc api://def" />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
<audiences>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[0])</audience>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[1])</audience>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[2])</audience>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[3])</audience>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[4])</audience>
</audiences>
</validate-jwt>
字符串
是的,这可以使用choose重写,但会在片段级别造成更多的重复,如果多个validate-jwt
属性需要可变数量的结果,它也不会扩展。
Fragment示例- ReusableJwtValidation
<fragment>
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
<openid-config url="https://login.microsoftonline.com/xxxxxxx/.well-known/openid-configuration" />
<audiences>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[0])</audience>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[1])</audience>
<audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[2])</audience>
</audiences>
<required-claims>
<claim name="roles" match="any" separator=" ">
<value>@((string)context.Variables["apiRoles"])</value>
</claim>
</required-claims>
</validate-jwt>
<set-header name="Authorization" exists-action="delete" />
</fragment>
型
用于API作用域策略
<policies>
<inbound>
<base />
<set-variable name="apiAudiences" value="api://dummyGuid1 api://dummyGuid2" />
<set-variable name="apiRoles" value="dev.DummyAPI.Read dev.DummyAPI.ReadWrite" />
<include-fragment fragment-id="ReusableJwtValidation" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
型
1条答案
按热度按时间6jygbczu1#
观众不支持
claim
这样的separator
属性,并且希望避免克隆片段以支持第二或第三观众。我已经使用了你的政策,它为我工作.如果你想使用
separator
的观众,那么你可以使用下面给出的政策.字符串
x1c 0d1x的数据
的
如果你想专门使用choose或foreach循环来覆盖多个受众,那么你可以与产品团队联系,以获得有关其可行性的更多信息。