如何从单个 ASP.NET Web API 项目在 Azure API 管理中有效地创建多个 API?

How to efficiently create multiple APIs in Azure API Management from a single ASP.NET Web API Project?

在 Azure API 管理 (APIM) 中,我目前有一个 API 和数百个 operations,它由一个整体 ASP.NET Web API 应用程序 (v5.2.3)。本质上,我想向不同的开发人员组公开操作的子集。

例如,给定具有三个操作(A、B 和 C)的 API,我希望团队 1 可以访问所有操作,而团队 2 只能访问操作 A。

问题:

  1. APIM 是否有内置的访问控制机制来实现操作的可见性?

  2. 如果 APIM 没有操作的访问控制,我应该使用多个 API 来进行分组吗?

  3. 如果我需要设置多个 API 来执行此操作,我可以从单个 ASP.NET Web API 项目中以什么优雅的方式执行此操作?

  1. APIM 在以下产品范围内具有可见性控制:https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-create-groups
  2. 由于只是在产品范围内,因此需要您创建多个API(仅在APIM中)并将它们放入单独的产品中。这些 API 中的每一个都可能指向相同的端点,只是定义了不同的操作。
  3. 如果可以的话,多个 swagger 文档将是最简单的方法。

我意识到这是一个古老的问题和答案,但我在搜索时没有找到我要找的东西,所以我的发现是:

API 管理支持访问组。产品可以在访问控制下设置访问组。这将使只有属于该组成员的用户才能在 ApiManagement 中看到它。这样做,您可以只为所有 API 创建一个订阅,并使用访问策略进行过滤,以验证您只能使用允许的 API,因为访问组。

我在 API 上使用了以下策略来确保用户具有访问权限以及 AllApis 订阅:

 <choose>
        <when condition="@(context?.User?.Groups == null || !(context.User.Groups.Any(q => q.Id == context?.Api?.Id)))">
            <return-response>
                <set-status code="401" reason="Unauthorized" />
                <set-header name="WWW-Authenticate" exists-action="override">
                    <value>Unauthorized. Subscription key not valid for this API."</value>
                </set-header>
            </return-response>
        </when>
    </choose>

总而言之,这最终实现了对 API 的自定义访问,仅使用一个订阅密钥。您可以选择用户和 API 访问的任意排列。