我非常希望能够根据用户的Jwt声明数据设置Azure API策略属性。我已经能够为计数键和增量条件等设置字符串值,但我无法设置所有属性。我想象做了以下的事情:
<rate-limit-by-key
calls="@((int) context.Variables["IdentityToken"].AsJwt().Claims.GetValueOrDefault("/LimitRate/Limit", "5"))"
renewal-period="@((int) context.Variables["IdentityToken"].AsJwt().Claims.GetValueOrDefault("/LimitRate/Duration/InSeconds", "60"))"
counter-key="@((string)context.Variables["Subject"])"
increment-condition="@(context.Response.StatusCode == 200)"
/>
然而,当我保存策略时似乎发生了一些验证,因为我收到以下错误:
Error in element 'rate-limit-by-key' on line 98, column 10: The 'calls' attribute is invalid - The value '@((int) context.Variables["IdentityToken"].AsJwt().Claims.GetValueOrDefault("/LimitRate/Limit", "5"))' is invalid according to its datatype 'http://www.w3.org/2001/XMLSchema:int' - The string '@((int) context.Variables["IdentityToken"].AsJwt().Claims.GetValueOrDefault("/LimitRate/Limit", "5"))' is not a valid Int32 value.
我甚至无法设置字符串参数(尽管格式严格)
<quota-by-key
calls="10"
bandwidth="100"
renewal-period="@((string) context.Variables["IdentityToken"].AsJwt().Claims.GetValueOrDefault("/Quota/RenewalPeriod", "P00Y00M01DT00H00M00S"))"
counter-key="@((string)context.Variables["Subject"])"
/>
当我尝试保存策略时,会给出以下内容:
Error in element 'quota-by-key' on line 99, column 6: @((string) context.Variables["IdentityToken"].AsJwt().Claims.GetValueOrDefault("/Quota/RenewalPeriod", "P00Y00M01DT00H00M00S")) is not in a valid format. Provide number of seconds or use 'PxYxMxDTxHxMxS' format where 'x' is a number.
我已经尝试了一大堆变体转换,Convert.ToInt32,声称不是字符串,@ {return 5},@(5)等,但似乎有一些验证发生在保存时停止它。
是否存在这个问题因为我认为添加到我的API会是一个有用的功能?
答案 0 :(得分:1)
按键限制的呼叫属性和按键分配不支持策略表达式。不幸的是,内部限制阻止我们根据请求对其进行处理。您可以做的最好的事情是将请求分类为几个有限的组,并使用选择策略有条件地应用速率限制/配额。
或者尝试使用increment-count属性来控制每个请求增加多少计数器。