2017-06-14 160 views
0

我们希望使用validate-jwt策略来保护API操作调用,但当我使用required-claims来检查范围时遇到问题。 例如:我有一个范围令牌,包括几个值,如“xxx.READ xxx.WRITE yyy.READ yyy.WRITE ...” 对于特定操作,我想使用validate-jwt策略来检查令牌包含范围链接,如:Azure API管理:验证jwt令牌范围

<required-claims> 
      <claim name="scp" match="any"> 
       <value>xxx.READ</value> 
      </claim> 
    </required-claims> 

但验证总是失败,因为在SCP内的多个值的......我怎么可以检查此要求?我必须先提取scp值,如果是,我该怎么做?提前

回答

0

多价值宣称

感谢应表示为JWT令牌里面阵列:

"scp": ["xxx.READ", "xxx.WRITE", "yyy.READ", "yyy.WRITE"] 

这个场景完全根据您所发布的政策配置中支持。

但是,如果你代表他们作为单个字符串(“xxx.READ xxx.WRITE yyy.READ yyy.WRITE”),那么你必须使用手动表达式继续沿着这条验证这些道理,东西:

<choose> 
    <when condition="@(context.Request.Headers.ContainsKey("Authorization"))"> 
     <set-variable name="token" value="@(context.Request.Headers.GetValueOrDefault("Authorization", string.Empty).AsJwt())" /> 
     <choose> 
      <when condition="@{ 
if (context.Variables["token"] == null) { 
    return false; 
} 

var scp = ((Jwt)context.Variables["token"]).Claims.GetValueOrDefault("scp", (string[])null); 
if (scp == null || scp.Length == 0) { 
    return false; 
} 

return scp.Any(c => c.Contains("xxx.READ")); 
      }"> 
       <return-response response-variable-name="existing response variable"> 
        <set-status code="401" reason="Unauthorized" /> 
       </return-response> 
      </when> 
     </choose> 
    </when> 
    <otherwise> 
     <return-response response-variable-name="existing response variable"> 
      <set-status code="401" reason="Unauthorized" /> 
     </return-response> 
    </otherwise> 
</choose> 
+0

好的。这是来自微软的Azure AD B2C,它以我解释的格式生成scp“xxx.READ yyy.READ ...” – user1523812

+0

哦,那不好。我会研究一下,谢谢报告。 –

+0

它会很棒。我们计划在Azure AD B2C上使用新的“已发布范围”和“api访问”选项,即使目前我们还没有与目标范围相关的页面询问用户的同意。我试图使用你的例子,但它的失败与条件的错误。 Thx – user1523812