Azure应用程序服务API 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策略,但它仍然不

我有一个托管在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政策:

<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