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

问题描述 投票:0回答:1

使用 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'.
) - 达到了以下工作的策略,但有足够的代码味道,必须有一个更干净的方式。

凌乱的 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> 
azure azure-api-management
1个回答
0
投票

受众不支持

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>

输出-

enter image description here

enter image description here

如果您想专门使用 select 或 foreach 循环迭代多个受众,那么您可以咨询产品团队以获取有关其可行性的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.