У меня есть API, импортированный в диспетчер API Azure, который содержит несколько конечных точек. Мне нужно определить политику в APIM, которая позволит одному идентификатору аудитории получать доступ ко всем конечным точкам в API, в то время как второй идентификатор аудитории может получить доступ только к двум конечным точкам и ему будет отказано в доступе к остальным конечным точкам.
Сначала я попробовал поиграться с параметром «Match="Any"» в требуемых утверждениях входящего раздела политики, но не смог найти способ выполнить функцию -and (если aud=XXX И эта конечная точка ....)
Во-вторых, я попробовал использовать функцию «Выбрать» в разделе исходящих сообщений, но не смог понять, как ссылаться на идентификаторы аудитории, если это вообще возможно.
Наконец, все поиски в Google и самостоятельные исследования привели либо к тупику, либо к информации, выходящей за рамки моего набора навыков.
ТИА,
Вы сможете сделать это с помощью комбинации 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, и все готово.