通过命名值重用 APIM 策略表达式

Posted

技术标签:

【中文标题】通过命名值重用 APIM 策略表达式【英文标题】:Reusing APIM policy expression via Named Value 【发布时间】:2019-06-04 13:36:41 【问题描述】:

我在重用 APIM 表达式时遇到问题。

具体来说,像上面一样创建下面的命名值,

name      
JWTValidator 

@(
@"<validate-jwt header-name='Authorization' failed-validation-httpcode='401' failed-validation-error-message='Error: expired token or invalid token' require-expiration-time='true' require-scheme='Bearer' require-signed-tokens='true'>
    <openid-config url='xxx' />
    <audiences>
        <audience>xxx</audience>
    </audiences>
    <issuers>
        <issuer>https://xxx</issuer>
    </issuers>
</validate-jwt>"
)

以及以下政策:

<policies>
    <inbound>
        <base />
        JWTValidator
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

但是,策略元素被移除而不是插入。

有什么想法吗?

有没有更好的方法来重用策略?

更新

我想将JWTValidator 定义为命名值,并尽可能在产品级别使用它,否则,API 级别。

更新 2

我已更改为下面,但是,JWTValidator 在保存时会自动删除。

请注意JWTValidator的值保存成功,这可能意味着语法正确。

<policies>
    <inbound>
        JWTValidator
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-properties

https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions

Reusing APIM policy expressions

https://feedback.azure.com/forums/248703-api-management/suggestions/16951852-code-re-use-in-api-policies-using-of-custom-functi

【问题讨论】:

【参考方案1】:

这实际上是 UI 问题。您应该能够在浏览器开发工具中看到保存策略的 PUT 请求成功并返回正确的保存内容。 UI 只是在呈现策略之前删除了属性引用。很快就会修复。

Property 可用于完整填写 XML 属性或 XML 元素的值。在您的情况下,您尝试设置值的一部分与静态元素和另一部分与属性值。不幸的是,这不受支持。换句话说,这是支持的:

<inbound>
    JWTValidator
</inbound>

这不是:

<inbound>
    <base />
    JWTValidator
</inbound>

属性只能作为一个整体替换元素值,并且不能与另一个元素并排使用,例如在您的示例中,在&lt;base/&gt; 旁边。

在您的情况下,我认为最好将此政策置于外部范围:如果您需要将其应用于许多操作,则在 API 级别;如果适用于多个 API,则在产品/全局级别。并制定政策根据 context.Operation.Id/context.Api.Id 有条件地应用它。

【讨论】:

我不太明白你的意思。请在 OP 上查找更新。 更新了答案。重用 validate-jwt 策略的唯一方法是将其置于上层范围。如果您想将它用于许多 API - 将其放入选择策略内的产品级别,并检查 context.Api.Id 以匹配 API id 之一。 什么时候修复?有我可以订阅的票吗? 是否有计划同时支持&lt;base /&gt;JWTValidator 和属性引用的组合也将被修复。下周某个时间。

以上是关于通过命名值重用 APIM 策略表达式的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Apim 的上下文中读取命名值

多行策略表达式中缺少“”

Azure APIM 策略

APIM 策略 - 无法投射对象

使用 Azure APIM 策略处理表单数据

如何将请求中的值复制到 Azure API 管理策略中的响应中