繁体   English   中英

在 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 策略时,它会显示语法错误。如何实现?

索赔是

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM