首页 > 解决方案 > 在计入使用配额之前检查用户是否属于特定组

问题描述

我想创建一个策略,让我们的员工可以调用 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"))" />

当我只有组的名称而不是其 ID 时,如何创建这样的策略?

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

或者,换一种说法;

如何确定对象列表是否包含具有特定属性值的对象?有点像 JavaScript 中的 find

标签: azure-api-management

解决方案


使用Linq 任何方法来获取真假,取决于给定名称是否存在。

要检查是否User在给定组中:

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

如果您想超级安全,请检查User对象是否存在(如果您使用“内置的全访问订阅”调用 API,它可以为空):

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

并恢复上述条件并检查是否User不在给定组中:

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

推荐阅读