【问题标题】:Azure APIM Validate JWT based on two different claimsAzure APIM 根据两个不同的声明验证 JWT
【发布时间】:2021-04-15 10:37:31
【问题描述】:

我正在尝试在 Azure APIM 中创建一个策略,以根据两个不同的声明验证 JWT 令牌(Azure AD 令牌)。

我的 API 可能被其他应用程序或用户使用 - 它可以从用户上下文或应用程序上下文中调用。因此,令牌可能包含“scp”声明,例如user_impersonation 或“角色”声明,如 [ "CallApiAsAnApp" ]

From the documentation,我还没有找到任何方法来做到这一点。这是可能的还是我必须在 API 级别实现自定义代码才能做到这一点?任何添加到保单中“必需的声明”的声明都成为强制性的。声明级别似乎没有任何“匹配任何”选项,只有值级别。

【问题讨论】:

  • this sample 能帮到你吗?我的意思是,如果你的请求有一些标签可以用来知道是检查角色还是 scp ?

标签: azure oauth-2.0 azure-api-management


【解决方案1】:

最后,我能找到解决问题的唯一方法是使用选择元素而不是 validate-jwt,并使用自定义代码(这是我希望避免的任何方式)。基本上,我将经过验证的 JWT 令牌保存到一个变量中,然后使用 if / elseif 来确定令牌是否可以接受。下面的工作相关配置

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" require-scheme="Bearer" output-token-variable-name="valid-jwt">
    <openid-config url="https://login.microsoftonline.com/tenantid/v2.0/.well-known/openid-configuration" />
    <issuers>
        <issuer>https://sts.windows.net/tenantid/</issuer>
    </issuers>
</validate-jwt>
<choose>
    <when condition="@{
        var jwt = (Jwt)context.Variables["valid-jwt"];
        if(jwt.Claims.ContainsKey("roles")){
            var roles = jwt.Claims["roles"];
            return !Array.Exists(roles, element => element == "MyRoleName");
        } else if (jwt.Claims.ContainsKey("scp")){
            var scp = jwt.Claims["scp"];
            return !Array.Exists(scp, element => element == "user_impersonation");
        } else { return true; }
    }">
<return-response>
    <set-status code="401" reason="Unauthorized" />
</return-response>
</when>
<otherwise />
</choose>

【讨论】:

    【解决方案2】:

    正如您提到的,令牌可能包含scp 声明或roles 声明,您的令牌似乎有时以“委托”类型生成,有时以“应用程序”类型生成。您只需要像下面的屏幕截图一样配置&lt;validate-jwt&gt; 策略,在其中添加两个声明并选择“任何声明”。

    之后,如果令牌仅包含一个声明,则可以验证令牌。

    顺便请检查一下你的token在两种情况下是否有相同的“Audiences”,否则上面的配置可能无法实现你的需求。

    【讨论】:

    • 不,这不起作用。如果我添加“scp”或“roles”,它们将单独工作,但是当我添加两者时,它不起作用 - 似乎期望“scp”和“roles”声称都存在。
    猜你喜欢
    • 2020-10-29
    • 2020-01-02
    • 2017-09-09
    • 2022-06-18
    • 1970-01-01
    • 2015-03-02
    • 2021-12-22
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多