使用 API 管理策略表达式 是否可以将可变长度数组输出到一组 XML 元素?
我使用策略片段和
<validate-jwt>
作为示例,我们的大多数策略仅需要单个<audience>
,但有一些具有多个的边缘情况。受众不支持像 separator
这样的 claim
属性,并且更愿意避免克隆片段只是为了支持第二个或第三个受众。
不幸的是,我看不到如何实现一个整洁的剃刀式 foreach 来构建 XML(验证错误:
Error in element 'validate-jwt' on line 17, column 2: The element 'audiences' cannot contain text. List of possible elements expected: 'audience'.
) - 达到了以下工作的策略,但有足够的代码味道,必须有一个更干净的方式。
<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>
<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>
<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>
受众不支持
之类的separator
属性,并且更愿意避免克隆片段以支持第二或第三个受众。claim
我已经使用了你们的政策,它对我有用。如果您想对受众使用
separator
,那么您可以使用以下给定的政策。
可重用JwtValidation-
<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/2773f7fd-d343-4afe-8230-e735719f9b0b/.well-known/openid-configuration" />
<required-claims>
<claim name="aud" match="any" separator=" ">
<value>@((string)context.Variables["apiAudiences"])</value>
</claim>
<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>
输出-
如果您想专门使用 select 或 foreach 循环迭代多个受众,那么您可以咨询产品团队以获取有关其可行性的更多信息。