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>
实现逻辑
- 首先读取请求头中的Origin字段值
- 将你提前配置在named values中的
cors-origins值按分号拆分,得到允许的域名列表 - 校验当前请求的Origin是否在允许列表中:如果存在则返回该Origin,等价于允许该域名跨域;如果不存在则返回空字符串,CORS策略会自动拦截该跨域请求
- 不需要修改你现有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.
相关产品推荐
相关产品推荐

