在 azure API 管理策略中迭代数组声明

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 policy 时,它显示语法 error.how 来实现此目的?

索赔是

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>

或者你可以像这样简化你的集合体

<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;
            }" />

(我只使用了 'If' 作为我处理的场景之一。还没有真正尝试过 ''else'。)