我正在构建一个多租户应用程序。我们没有使用Azure Active directory。我们正在使用逻辑应用程序作为后端服务。由于每个API url都有一个参数租户,所以我们希望在API管理层包含。
https://apm-eso-01.azure-api.net/{tenant}/v1/{siteid}/inventoryItems
是否有可能在API管理级别向主机URL添加路径参数,而不是在逻辑应用程序中作为相对路径
后端URL。我们为每个租户提供不同的设备/服务器
租户1:
https://esous-devpd1.host.com/retail/data/esosm/api/v1-beta2/get/1
租户2:
https://esospanish-devpd1.host.com/retail/data/esosm/api/v1-beta2/get/1
APIM Urls
https://apm-eso-host-sbx-01.azure-api.net/lse/{tenant}/esom/api/v1/get/1
为了在APIM url/endpoint支持租户的占位符,我应该将租户占位符或路径参数添加到后端url,如下所示。
https://esous-devpd1.host.com/retail/data/esosm/{tennant}/api/v1-beta2/get/1
但我所有的url都应该有tenant作为路径参数。
因此,我的问题是我们是否可以将租户占位符或路径参数添加到APIM端点,并直接重写后端服务器url以包含租户参数,而不是将其添加到后端url
这可以通过确保APIM中的所有操作URL模板都以/{tenant}/开头来实现。然后,您可以添加全局或API级别的策略来进行转换:
<rewrite-uri template="@{
var operationPath = context.Operation.UrlTemplate.TrimStart('/').Replace("{*", "{");
var result = operationPath.Substring(operationPath.IndexOf('/'));
return ("/retail/data" + result).Replace("/v1/", "/v1-beta2/");
}" />
此策略将通过从URI模板中删除第一个段来重写当前请求的URI。因此,如果APIM接收到对/{tenant}/xxx
操作的请求,它将把它重写为/xxx
。
然后您可以通过以下方式添加租户作为查询参数:
<set-query-parameter name="tenant" exists-action="override">
<value>@(context.Request.MatchedParameters["tenant"])</value>
</set-query-parameter>