如何从单个 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。
问题:
APIM 是否有内置的访问控制机制来实现操作的可见性?
如果 APIM 没有操作的访问控制,我应该使用多个 API 来进行分组吗?
如果我需要设置多个 API 来执行此操作,我可以从单个 ASP.NET Web API 项目中以什么优雅的方式执行此操作?
- 一些可能的方法包括...
- 生成多个Swagger文档
- 在这种情况下,它的参与度很高 generating multiple Swagger documents is not explicitly supported in Swashbuckle with ASP.NET Web API v5.3.2 (although it is supported in ASP.NET Core)。
- Swashbuckle 作者建议two possible workarounds:
- 利用 MultipleApiVersions,作为一种技巧。
- 用 post-processing 拆分完整的 Swagger。
- 将单一的 Web API 项目拆分为多个项目(我在 a MSDN forum and in a Swashbuckle issue 764 中看到了建议,但这对我来说似乎有点过分了。
- APIM 在以下产品范围内具有可见性控制:https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-create-groups。
- 由于只是在产品范围内,因此需要您创建多个API(仅在APIM中)并将它们放入单独的产品中。这些 API 中的每一个都可能指向相同的端点,只是定义了不同的操作。
- 如果可以的话,多个 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 访问的任意排列。
在 Azure API 管理 (APIM) 中,我目前有一个 API 和数百个 operations,它由一个整体 ASP.NET Web API 应用程序 (v5.2.3)。本质上,我想向不同的开发人员组公开操作的子集。
例如,给定具有三个操作(A、B 和 C)的 API,我希望团队 1 可以访问所有操作,而团队 2 只能访问操作 A。
问题:
APIM 是否有内置的访问控制机制来实现操作的可见性?
如果 APIM 没有操作的访问控制,我应该使用多个 API 来进行分组吗?
如果我需要设置多个 API 来执行此操作,我可以从单个 ASP.NET Web API 项目中以什么优雅的方式执行此操作?
- 一些可能的方法包括...
- 生成多个Swagger文档
- 在这种情况下,它的参与度很高 generating multiple Swagger documents is not explicitly supported in Swashbuckle with ASP.NET Web API v5.3.2 (although it is supported in ASP.NET Core)。
- Swashbuckle 作者建议two possible workarounds:
- 利用 MultipleApiVersions,作为一种技巧。
- 用 post-processing 拆分完整的 Swagger。
- Swashbuckle 作者建议two possible workarounds:
- 在这种情况下,它的参与度很高 generating multiple Swagger documents is not explicitly supported in Swashbuckle with ASP.NET Web API v5.3.2 (although it is supported in ASP.NET Core)。
- 将单一的 Web API 项目拆分为多个项目(我在 a MSDN forum and in a Swashbuckle issue 764 中看到了建议,但这对我来说似乎有点过分了。
- 生成多个Swagger文档
- 一些可能的方法包括...
- APIM 在以下产品范围内具有可见性控制:https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-create-groups。
- 由于只是在产品范围内,因此需要您创建多个API(仅在APIM中)并将它们放入单独的产品中。这些 API 中的每一个都可能指向相同的端点,只是定义了不同的操作。
- 如果可以的话,多个 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 访问的任意排列。