目标:
从命名值动态地将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>
到目前为止我尝试过的:
- 动态创建
<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'不能包含文本。预期的可能元素列表:"允许的起源、允许的标头、公开标头、允许的方法">
- 仅动态创建
<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>