Проверьте, принадлежит ли пользователь к определенной группе, прежде чем рассчитывать на квоту использования

#azure-api-management

Вопрос:

Я хочу создать политику, в которой наши сотрудники могли бы вызывать API без учета какой-либо квоты. Наши сотрудники принадлежат к одной определенной группе в решении для управления API. Я хочу, чтобы все остальные пользователи, не входящие в эту группу, учитывали квоту использования для своей подписки.

Моя проблема в том, что я не могу понять, как проверить, находится ли пользователь в определенной группе в when состоянии, потому что список групп в объекте пользователя-это список объектов.

Это кажется простым, когда это карта (например, заголовки) или просто массив строк:

 <!-- for maps, but it is not a map -->
<when condition="@(context.User.Groups.ContainsKey("myGroup"))" />

<!-- for arrays if you know all properties --> 
<when condition="@(context.User.Groups.Contains("myGroup"))" />
 

Как я могу создать подобную политику, если у меня есть только имя группы, а не ее идентификатор?

 <when condition="@(!context.User.isInGroup("myGroup")">
    <quota calls="10000" bandwidth="40000" renewal-period="3600" />
</when>
 

Или, выражаясь по-другому;

Как я могу узнать, содержит ли список объектов объект с определенным значением свойства? Что — то вроде поиска в JavaScript.

Ответ №1:

Используйте Linq Любой метод, чтобы получить значение true или false, в зависимости от того, существует данное имя или нет.

Чтобы проверить, входит ли User он в данную группу:

 <when condition="@(context.User.Groups.Any(x => x.Name == "myGroup"))">
 

Если вы хотите быть сверхбезопасным, проверьте также User , существует ли объект (он может быть равен нулю, если вы вызываете API со «Встроенной подпиской на полный доступ»).:

 <when condition="@(context.User != null amp;amp; context.User.Groups.Any(x => x.Name == "myGroup"))">
 

И вернуться к вышеуказанному условию и проверить User , не находится ли он в данной группе:

 <when condition="@(context.User == null || !context.User.Groups.Any(x => x.Name == "myGroup"))">
 

Комментарии:

1. Именно то, что я искал, большое спасибо! Я видел, что свойство Groups реализует IEnumerable, но я не мог понять, какие методы доступны в этом интерфейсе.