首页 > 解决方案 > 验证每个操作或所有操作的 JWT 策略

问题描述

我目前在 Azure APIM 中有一个包含多个操作的 API 设置。我在All Operations部分实施了 JWT Bearer 身份验证策略。

我现在需要做的是根据我的令牌中返回的范围来实现每个操作的授权部分。我已经查看了这个示例并了解了API Authorization Restriction该怎么做

但是,尝试在根所有操作上实施策略,然后在该策略中检查所请求的操作并编写代码以将正确的范围与操作相匹配,这是好还是坏的做法。

或者是否应该为每个操作复制/粘贴 JWT 策略,然后只有该操作授权逻辑存在。

提前致谢。

标签: jwtazure-api-management

解决方案


因此,您可以在 Global、Product、API 和精细操作级别应用策略。

然后将这些策略一起评估,以形成针对您的请求的有效策略。

我最终做的是在所有操作 级别应用该validate-jwt策略。这意味着对于我的 API 中的任何操作,我的令牌都将通过身份验证。

<policies>
<inbound>
    <base />
    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Not authenticated, token invalid." output-token-variable-name="jwt">
        <openid-config url="redacted" />
        <audiences>
            <audience>redacted</audience>
        </audiences>
        <issuers>
            <issuer>redacted</issuer>
        </issuers>
    </validate-jwt>
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>

然后,我通过使用choose when策略检查 JWT 令牌中的范围参数,将策略添加到操作中以执行授权。您需要确保将其添加到<base/>策略元素之后。

<policies>
<inbound>
    <base />
    <choose>
        <when condition="@(!((Jwt)context.Variables["jwt"]).Claims.GetValueOrDefault("scope").Contains("read:user"))">
            <return-response>
                <set-status code="403" reason="Forbidden" />
            </return-response>
        </when>
    </choose>
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>

推荐阅读