![](/img/trans.png)
[英]Condition to check context.Request.Body is JArray or JObject in azure api management policy
[英]Iterate a array claim in azure API management Policy
我想在 azure api 管理策略中迭代 JWT 令牌的声明
<set-variable name="testparams" value="@(context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"].FirstOrDefault())" />
<set-variable name="values">
{% for value in testparams %}
if(value=="BMW")
<set-variable name="testparams" value=true />
break
else
<set-variable name="testparams" value=false />
{% endfor %}
/>
<base />
</inbound>
<policies>
如果成功,这是我想要迭代和设置变量的方式。 当我将此代码放入 azure 策略时,它会显示语法错误。如何实现?
索赔是
carlist = "[宝马、奥迪、菲亚特]"
您的代码中有一些错误。
首先, .FirstOrDefault()
是获取列表的第一项。 根据我的测试,它会得到“ BMW ”而不是“ [BMW,AUDI,FIAT] ”。
然后,如果我们使用<set-variable name="testparams" value="@(context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"])" />
没有.FirstOrDefault()
。 它将显示错误消息,因为变量不能在<set-variable>
标签中设置为数组。
除此之外,在您的下一个代码中,我对您想如何设置变量感到困惑。 我不知道您是否要将值true/false
为变量testparams
或变量values
。 并且代码中有一些语法错误。
根据一些测试,我认为很难从 jwt 令牌中获取数组列表并将其设置为<set-variable>
标签中的变量。 我为您的参考提供了一个解决方法,它可以在<set-body>
代码中设置一个变量resultVar
。 请检查它是否能满足您的要求。
<inbound>
<base />
<set-body>@{
string[] carList = context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"];
string resultVar = "";
foreach(string value in carList)
{
if (value == "BMW") {
resultVar = "true";
break;
}else {
resultVar = "false";
}
}
return resultVar;
}</set-body>
</inbound>
或者你可以像这样简化你的 set-body
<inbound>
<base />
<set-body>@{
string[] carList = context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"];
return carList.Contains("BMW").ToString();
}
</set-body>
</inbound>
如果有人仍在寻找在输入为 json 类型时在 set-variable 中循环的答案,这可能会有所帮助
<set-variable name="values" value="@{
JObject json = (JObject)context.Variables["testparams"];
var array = (json)["carlist"];
var ret = (string)"";//set some default string or bool data;
foreach (var value in array)
{
if ((string)value=="BMW")
{
ret = "true";
break;
}
else
{
ret = "false";
}
}
return ret;
}" />
(我只在我处理过的一个场景中使用了“如果”。还没有真正尝试过“其他”。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.