我有一个 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 小时,因此使用相同的令牌来完成所有这些测试。
有人有任何想法或遇到类似问题吗?
最后,我知道“正确”的解决方案是使用产品并在那里应用策略,但我只有几个客户,并且想尝试一下,而无需设置产品等的开销。
谢谢!
当条件为
<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>