You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure APIM CORS策略如何通过named values动态配置allowed-origins

实现方案

你可以通过CORS策略内置的动态校验能力实现需求,无需动态生成XML节点,代码示例如下:

<policies>
<inbound>
    <cors>
        <allowed-origins>
            <!-- 直接在origin节点内使用表达式做域名匹配 -->
            <origin>@(context.Request.Headers.Origin.FirstOrDefault(origin => "{{cors-origins}}".Split(';').Contains(origin)) ?? string.Empty)</origin>
        </allowed-origins>
        <allowed-methods>
            <method>GET</method>
            <method>POST</method>
        </allowed-methods>
    </cors>
</inbound>
<backend>
    <forward-request />
</backend>
<outbound />
<on-error />
</policies>

实现逻辑

  1. 首先读取请求头中的Origin字段值
  2. 将你提前配置在named values中的cors-origins值按分号拆分,得到允许的域名列表
  3. 校验当前请求的Origin是否在允许列表中:如果存在则返回该Origin,等价于允许该域名跨域;如果不存在则返回空字符串,CORS策略会自动拦截该跨域请求
  4. 不需要修改你现有named values的配置,可直接复用分号分隔的域名格式

可选优化:如果你的cors-origins配置中可能存在空格,可以拆分后先做Trim处理,表达式调整为:

@(context.Request.Headers.Origin.FirstOrDefault(origin => "{{cors-origins}}".Split(';').Select(o => o.Trim()).Contains(origin)) ?? string.Empty)

原有方案报错原因

你之前尝试动态返回XElement节点的写法不符合APIM策略的校验规则:APIM会先校验策略的XML结构合法性,不允许直接在节点层级插入C#代码返回的XML元素,仅支持在节点的属性值、文本值位置使用策略表达式。

内容的提问来源于stack exchange,提问作者Cristian E.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:09:03