Azure API Management - cors policy.无法<allowed-origins>从命名值动态提供



目标:

从命名值动态地将cors原点传递给cors策略。

示例:

假设我有以下命名值:

name: cors-origins
value: https://domain1.com;https://domain2.com

以及打算利用该命名值cors-origins:的CORS策略

<policies>
<inbound>
<cors>
<allowed-origins>
// Here I need to use {{ cors-origins }}
// The expected output is:
// <origin>https://domain1.com</origin>
// <origin>https://domain2.com</origin>
</allowed-origins>
<allowed-methods>
<method>GET</method>
<method>POST</method>
</allowed-methods>
</cors>
</inbound>
<backend>
<forward-request />
</backend>
<outbound />
<on-error />
</policies>

到目前为止我尝试过的:

  1. 动态创建<allowed-origins>部分:

代码段:

...
<cors>
@{
var origins = "{{cors-origins}}".Split(';');
return new XElement("allowed-origins", origins.Select(domain => new XElement("origin",domain)));
// outputs:
// <allowed-origins>
//   <origin>https://domain1.com</origin>
//   <origin>https://domain2.com</origin>
// </allowed-origins>
}

...
</cors>

错误:元素'cors'不能包含文本。预期的可能元素列表:"允许的起源、允许的标头、公开标头、允许的方法">

  1. 仅动态创建<origin>元素

问题:有办法实现预期目标吗

无法在APIM策略中动态添加标记。您可以做的是从请求标头中读取请求来源,并检查它是否存在于允许来源列表中。

参考:如何使Azure API管理(API网关)CORS策略动态?

对于您的情况,它应该类似于:

<fragment>
<cors allow-credentials="true">
<allowed-origins>
<origin>@{
var origins = "{{cors-origins}}".Split(';');
string origin = context.Request.Headers.GetValueOrDefault("Origin", "");
bool isAllowedOrigin = Array.IndexOf(origins, origin) > -1;
return isAllowedOrigin ? origin : "";
}</origin>
</allowed-origins>
<allowed-methods preflight-result-max-age="300">
<method>*</method>
</allowed-methods>
<allowed-headers>
<header>*</header>
</allowed-headers>
<expose-headers>
<header>*</header>
</expose-headers>
</cors>

最新更新