Azure应用程序服务API CORS策略不工作
我有一个托管在Azure(Azure应用程序服务)上的.NET核心API,它在APIM后面运行。我现在需要从前端调用此API(再次使用APIM端点),但我无法正确设置CORS。我不想在代码中定义CORS-我的.NET代码没有CORS策略设置 CORS是通过在CORS刀片中添加允许的来源在应用程序服务级别上设置的,但通过APIM调用API时,飞行前请求仍然没有CORS头(因此我得到“对飞行前请求的响应未通过访问控制检查…”)。我已经为各个API的所有操作向APIM实例添加了CORS策略,但它仍然不起作用。“选项”请求返回时,浏览器调试器上没有Access Control Allow Origin标头。如果我跳过APIM并直接调用API,它就可以正常工作。我是不是漏掉了什么明显的东西 APIM的CORS政策:Azure应用程序服务API CORS策略不工作,azure,cors,azure-web-app-service,Azure,Cors,Azure Web App Service,我有一个托管在Azure(Azure应用程序服务)上的.NET核心API,它在APIM后面运行。我现在需要从前端调用此API(再次使用APIM端点),但我无法正确设置CORS。我不想在代码中定义CORS-我的.NET代码没有CORS策略设置 CORS是通过在CORS刀片中添加允许的来源在应用程序服务级别上设置的,但通过APIM调用API时,飞行前请求仍然没有CORS头(因此我得到“对飞行前请求的响应未通过访问控制检查…”)。我已经为各个API的所有操作向APIM实例添加了CORS策略,但它仍然不
<policies>
<inbound>
<base />
<cors>
<allowed-origins>
<origin>*</origin>
</allowed-origins>
<allowed-methods>
<method>GET</method>
<method>POST</method>
<method>OPTIONS</method>
<method>TRACE</method>
<method>PUT</method>
<method>DELETE</method>
<method>HEAD</method>
<method>PATCH</method>
</allowed-methods>
<allowed-headers>
<header>*</header>
</allowed-headers>
</cors>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<set-header name="Access-Control-Allow-Origin" exists-action="override">
<value>*</value>
</set-header>
</outbound>
<on-error>
<base />
</on-error>
</policies>
在这些设置中,选中“允许凭据”复选框,这也不会改变任何内容
当我添加set header选项时,如果我通过postman直接调用API,那么访问控制Allow Origin将在postman调用中返回,但在浏览器飞行前请求中仍然没有返回任何内容
编辑:
每个响应。。我试图通过创建一个全新的API来简化这个场景,并在其中部署了模板“weather forecast”.net核心API。未将身份验证和CORS策略设置为*。我继续将这个API添加到我的APIM实例中——只需单击APIM菜单中的应用程序服务选项并添加CORS策略——其他什么都没有。然后,在一个单独的URL(供CORS触发)中,我部署了一个简单的HTML,并调用了新的APIM端点。头看起来完全一样-没有CORS头,调用失败,如果我跳过APIM并直接调用后端,它就会工作。此时,我无法发现设置中的任何错误,不知道我可能遗漏了什么。下面是截图
您似乎可以成功访问api,但看不到您设置的响应头问题可能是您在代码中隐藏了一些响应头。
我的建议是:
通过浏览应用程序服务url查看响应标题:https://yourbackend.azurewebsites.net/
。如果响应标题仅包含两个元素(如最终图片),则不会显示访问控制允许原点
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu强
用于测试:
我创建了一个后端api项目和一个前端项目来调用api,并将它们发布到单独的应用程序服务中
然后,测试从前端应用程序调用api,失败,出现此错误:
Access to XMLHttpRequest at 'back-end url' from origin 'front-end url' has been blocked by CORS policy:
在门户上配置CORS选项后,调用“https://myfront-end.azurewebsites.net/home/test
”,按预期工作。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu强
现在,我们来看看APIM部分:
我创建了一个APIM,并将我的后端应用程序服务添加为API:
配置设置以包括我的应用程序服务url:
使用您的配置CORS策略:
4.将API的端点修改为我的前端项目:
它与标题“访问控制允许源代码”
配合得很好。您说过:
我遇到了同样的问题
如果我像您一样在“入站策略”中设置“允许的方法”,并尝试进行修补,我会像您一样得到错误,并且飞行前请求的响应头中除了您看到的两个之外没有其他内容
但是,如果我将“允许的方法”入站策略更改为*并删除GET、POST、OPTIONS等,则飞行前请求具有预期的所有响应头:
您应该尝试在入站策略中为允许的方法设置“*”(附带说明,我在出站策略中没有任何“设置头”)
注:
我得到“飞行前响应中的访问控制允许方法不允许使用方法补丁”。即使它出现在响应标题中。我终于找到了问题。创建API管理实例时,通常还需要一个门户,供用户查看模式、订阅API并在浏览器中进行测试。要做到这一点,创建APIM实例后,您只需转到门户概览部分并单击发布+启用CORS,这是我为我们的API所做的。这实际上是在“所有API”级别设置一个origin=Portal URL的CORS策略,该策略覆盖您在API/方法级别可能设置的任何CORS策略
不幸的是,我从未考虑过可能会在“所有API”级别定义任何策略,因此我甚至从未单击过该级别。此外,接口上没有警告可能存在,也没有警告它覆盖较低级别的策略。一旦我在“所有API”级别上设置了正确的源代码,一切都可以完美地工作。希望这能帮助有类似问题的人
仍在努力解决这一问题。我测试过绕过APIM,直接调用后端时CORS工作正常,所以问题似乎是APIM本身。无论我试图设置什么策略,options请求总是返回,没有任何头,如上所述。我尝试将选项请求(路由*)转发到后端,但也不起作用。是否有任何进展?使用新的“干净”测试进行编辑请参见编辑-我尝试了与您所做的完全相同的操作,但仍然无法使其工作。不知何故,我只是没有在某个地方看到明显的错误?即使在门户上没有任何设置的情况下运行它,它是否也只显示这两个响应标题?很抱歉延迟,错过了响应通知。是的,我在门户中尝试了几种设置组合,包括删除所有内容(API管理设置)和it alwa