条件 JWT 主题时 APIM 按密钥配额策略

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

我有一个 API,目前使用 validate-jwt 策略进行保护。 我从变量获得的输出令牌,想要为不同的客户提供不同的配额,为此我使用 JWT 的“主题”来识别。 如果我在入站策略中有按键配额,没有何时条件和 JWT 主题的计数器键(jwt-token 是来自 validate-jwt 策略的输出令牌),这似乎有效。 经过 5 次调用后,我在邮递员测试中收到 403 Quota Exceeded:

<quota-by-key calls="5" renewal-period="86400" counter-key="@(((Jwt)context.Variables["jwt-token"]).Subject)" />

如果我然后尝试将其嵌入到一个条件中,那么根据主题,我想给他们不同的配额,我似乎无法让它发挥作用。 我尝试过例如:

<when condition="@(((Jwt)context.Variables["jwt-token"]).Subject == "MYSUBJECTSTRING")">
                <quota-by-key calls="5" renewal-period="86400" counter-key="@(((Jwt)context.Variables["jwt-token"]).Subject)" />
            </when>

下面的“主题”在 MS 上定义为字符串(因此使用等于):

<when condition="@(((Jwt)context.Variables["jwt-token"]).Subject.Equals("MYSUBJECTSTRING"))">
                <quota-by-key calls="5" renewal-period="86400" counter-key="@(((Jwt)context.Variables["jwt-token"]).Subject)" />
            </when>

这些都不起作用,我可以完成 5 个电话。 这一切都使用相同的令牌,因此主题是相同的......事实上,令牌的有效期为 24 小时,因此使用相同的令牌来完成所有这些测试。

有人有任何想法或遇到类似问题吗?

最后,我知道“正确”的解决方案是使用产品并在那里应用策略,但我只有几个客户,并且想尝试一下,而无需设置产品等的开销。

谢谢!

azure jwt policy quota apim
1个回答
0
投票

当条件为

<choose></choose>
时使用。

我能够通过使用给定的策略获得预期的响应。

<policies>
    <inbound>
        <base />
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized" require-expiration-time="true" require-scheme="Bearer" require-signed-tokens="true">
            <openid-config url="https://login.microsoftonline.com/{tenantId}/v2.0/.well-known/openid-configuration" />
            <issuers>
                <issuer>https://sts.windows.net/{tenantId}/</issuer>
            </issuers>
        </validate-jwt>
        <set-variable name="jwt-token" value="@(context.Request.Headers.GetValueOrDefault("Authorization").AsJwt())" />
        <choose>
            <when condition="@(((Jwt)context.Variables["jwt-token"]).Subject == "{Subject}")">
                <quota-by-key calls="5" renewal-period="300" counter-key="@(((Jwt)context.Variables["jwt-token"]).Subject)" />
            </when>
        </choose>
    </inbound>
</policy>

enter image description here enter image description here

enter image description here

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