Как условно ограничить доступ к конечной точке API на основе идентификатора аудитории?

У меня есть API, импортированный в диспетчер API Azure, который содержит несколько конечных точек. Мне нужно определить политику в APIM, которая позволит одному идентификатору аудитории получать доступ ко всем конечным точкам в API, в то время как второй идентификатор аудитории может получить доступ только к двум конечным точкам и ему будет отказано в доступе к остальным конечным точкам.

Сначала я попробовал поиграться с параметром «Match="Any"» в требуемых утверждениях входящего раздела политики, но не смог найти способ выполнить функцию -and (если aud=XXX И эта конечная точка ....)

Во-вторых, я попробовал использовать функцию «Выбрать» в разделе исходящих сообщений, но не смог понять, как ссылаться на идентификаторы аудитории, если это вообще возможно.

Наконец, все поиски в Google и самостоятельные исследования привели либо к тупику, либо к информации, выходящей за рамки моего набора навыков.

ТИА,

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы сможете сделать это с помощью комбинации choose, when и otherwise. Ниже предполагается, что ваш JWT, представленный клиентом, имеет заявку на аудит, которая затем будет рассмотрена с помощью jwt_claims["aud"] после проверки токена.

Оператор AND в выражении условия обозначается &&, а OR||, как и в C#.

<policies>
    <inbound>
        <base />
        <!-- Validate JWT Token -->
        <validate-jwt header-name = "Authorization" failed-validation-httpcode = "401" failed-validation-error-message = "Unauthorized. Invalid or expired token." require-exp = "true" require-scheme = "Bearer" require-signed-tokens = "true">
            <audiences>
                <audience>aud1</audience>
                <audience>aud2</audience>
            </audiences>
            <issuers>
                <!-- Add your JWT token issuer here -->
                <issuer>https://your-issuer.com/</issuer>
            </issuers>
            <keys>
                <!-- Add your JWT token keys here -->
                <key>
                    <certificate>PASTE-TOKEN-SIGNING-PUBLIC-KEY-HERE</certificate>
                </key>
            </keys>
        </validate-jwt>
        <!-- Define policy logic to check for audience and endpoint access -->
        <choose>
            <when condition = "@(jwt_claims['aud'] == 'aud1')">
                <!-- Allow aud1 access to all endpoints -->
                <base />
            </when>
            <when condition = "@(jwt_claims['aud'] == 'aud2')">
                <choose>
                    <when condition = "@(context.Request.MatchedRoute.Path.Value == "/endpoint1" || context.Request.MatchedRoute.Path.Value == "/endpoint2")">
                        <!-- Allow access to specific endpoints for aud2 -->
                        <base />
                    </when>
                    <otherwise>
                        <!-- Deny access to other endpoints for aud2 -->
                        <return-response>
                            <set-status code = "403" reason = "Forbidden" />
                        </return-response>
                    </otherwise>
                </choose>
            </when>
            <otherwise>
                <!-- Deny access if audience ID is not recognized -->
                <return-response>
                    <set-status code = "403" reason = "Forbidden" />
                </return-response>
            </otherwise>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

Обновите политику, указав соответствующие значения для имени утверждения аудитории, идентификаторов аудитории, эмитента токена, открытого ключа подписи токена, конечных точек API, и все готово.

Другие вопросы по теме