azure 具有数组驱动的XML元素的APIM策略表达式

jtw3ybtb  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(158)

使用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示例

  1. <set-variable name="apiAudiences" value="api://abc api://def" />
  2. <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
  3. <audiences>
  4. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[0])</audience>
  5. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[1])</audience>
  6. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[2])</audience>
  7. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[3])</audience>
  8. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[4])</audience>
  9. </audiences>
  10. </validate-jwt>

字符串
是的,这可以使用choose重写,但会在片段级别造成更多的重复,如果多个validate-jwt属性需要可变数量的结果,它也不会扩展。

Fragment示例- ReusableJwtValidation

  1. <fragment>
  2. <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
  3. <openid-config url="https://login.microsoftonline.com/xxxxxxx/.well-known/openid-configuration" />
  4. <audiences>
  5. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[0])</audience>
  6. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[1])</audience>
  7. <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[2])</audience>
  8. </audiences>
  9. <required-claims>
  10. <claim name="roles" match="any" separator=" ">
  11. <value>@((string)context.Variables["apiRoles"])</value>
  12. </claim>
  13. </required-claims>
  14. </validate-jwt>
  15. <set-header name="Authorization" exists-action="delete" />
  16. </fragment>

用于API作用域策略

  1. <policies>
  2. <inbound>
  3. <base />
  4. <set-variable name="apiAudiences" value="api://dummyGuid1 api://dummyGuid2" />
  5. <set-variable name="apiRoles" value="dev.DummyAPI.Read dev.DummyAPI.ReadWrite" />
  6. <include-fragment fragment-id="ReusableJwtValidation" />
  7. </inbound>
  8. <backend>
  9. <base />
  10. </backend>
  11. <outbound>
  12. <base />
  13. </outbound>
  14. <on-error>
  15. <base />
  16. </on-error>
  17. </policies>

6jygbczu

6jygbczu1#

观众不支持claim这样的separator属性,并且希望避免克隆片段以支持第二或第三观众。
我已经使用了你的政策,它为我工作.如果你想使用separator的观众,那么你可以使用下面给出的政策.

  • ReusableJwtValidation*-
  1. <fragment>
  2. <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
  3. <openid-config url="https://login.microsoftonline.com/2773f7fd-d343-4afe-8230-e735719f9b0b/.well-known/openid-configuration" />
  4. <required-claims>
  5. <claim name="aud" match="any" separator=" ">
  6. <value>@((string)context.Variables["apiAudiences"])</value>
  7. </claim>
  8. <claim name="roles" match="any" separator=" ">
  9. <value>@((string)context.Variables["apiRoles"])</value>
  10. </claim>
  11. </required-claims>
  12. </validate-jwt>
  13. <set-header name="Authorization" exists-action="delete" />
  14. </fragment>

字符串

  • 输出 *-

x1c 0d1x的数据



如果你想专门使用choose或foreach循环来覆盖多个受众,那么你可以与产品团队联系,以获得有关其可行性的更多信息。

展开查看全部

相关问题