如何通过API Management Policy Expressions生成可变长度XML元素?
能否通过API管理策略表达式将可变长度数组输出为一组XML元素?
我正在使用策略片段和<validate-jwt>策略,大部分场景仅需单个<audience>元素,但存在需配置多个受众的边缘情况。由于<audiences>不具备<claim>那样的separator属性,我希望避免为支持2-3个受众而复制策略片段。
我尝试实现类似Razor风格的foreach来构建XML元素,但出现验证错误:Error in element 'validate-jwt' on line 17, column 2: The element 'audiences' cannot contain text. List of possible elements expected: 'audience'.。目前已实现一种可行但不够简洁的方案(如下POC示例)。
不够简洁的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>的多个属性都需要可变数量结果,该方案扩展性不佳。
策略片段示例 - 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>
内容的提问来源于stack exchange,提问作者Tony W
相关产品推荐
相关产品推荐

