Azure 应用服务 API CORS 策略不起作用

标签 azure cors azure-web-app-service

我有一个托管在 Azure(Azure 应用服务)上的 .NET Core API,它在 APIM 后面运行。我现在需要从前端调用此 API(再次使用 APIM 端点),但我无法正确设置 CORS。我不想在代码中定义 CORS - 我的 .NET 代码的 CORS 策略设置为零。

CORS 是通过在 CORS Blade 中添加允许的来源在应用程序服务级别设置的,但在通过 APIM 调用 API 时,预检请求仍然没有 CORS header (因此我得到“对预检请求的响应未通过访问权限”)控制检查...”)。我已将 CORS 策略添加到 APIM 实例以用于相应 API 的所有操作,但它仍然不起作用。返回的“Options”请求在浏览器调试器上没有 Access-Control-Allow-Origin header 。如果我跳过 APIM 并直接调用 API,则效果很好。我在这里遗漏了一些明显的东西吗?

cors policy in app service 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>

请注意,我还尝试专门添加前端 URL https://frontend.com在这些设置中并选中“允许凭据”复选框,这也没有改变任何内容。

当我添加 set-header 选项时,如果我直接通过 postman 调用 API,则在 postman 调用中会返回 Access-Control-Allow-Origin,但在浏览器预检请求中仍然没有返回任何内容。

debugger

编辑:

根据响应..我尝试通过创建一个全新的 API 并部署了模板“天气预报”.net core api 来简化场景。没有身份验证且 CORS 策略设置为 *。我继续将此 API 添加到我的 APIM 实例中 - 只需单击 APIM 菜单中的“应用程序服务”选项并添加 CORS 策略 - 没有其他任何内容。然后,在一个单独的 URL(用于触发 CORS)中,我部署了一个简单的 HTML,并调用了新的 APIM 端点。 header 看起来完全相同 - 没有 CORS header 并且调用失败,如果我跳过 APIM 并直接调用后端,它就可以工作。此时我无法发现我的设置中有任何错误,不知道我可能缺少什么。截图如下

app service setup apim apim 2 request failure

最佳答案

终于找到问题了。当您创建 API 管理实例时,通常您还需要一个门户,供用户查看您的架构、订阅您的 API 并在浏览器中测试它。为此,创建 APIM 实例后,您只需转到门户概述部分并单击发布 + 启用 CORS,这就是我为 API 所做的操作。它实际上的作用是在“所有 API”级别设置一个带有 origin=Portal URL 的 CORS 策略,并且此策略会覆盖您可能在 API/方法级别设置的任何 CORS 策略。

不幸的是,我从未考虑过可能在“所有 API”级别定义了任何策略,因此我什至从未单击过那里。此外,界面上没有任何警告表明可能存在该警告,也没有警告它会覆盖较低级别的策略。一旦我在“所有 API”级别设置了正确的原点,一切就完美了。希望这对遇到类似问题的人有所帮助!

enter image description here

关于Azure 应用服务 API CORS 策略不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66156414/

相关文章:

javascript - 无法使用 Rest API (JavaScript) 从浏览器上传 Azure 存储文件共享文件

azure - 将 Azure VMS 从一个帐户的一个订阅移动到另一个帐户的另一个订阅的最快方法

jquery - Axios 对雅虎天气 API 的请求失败

azure - 如何从azure应用程序服务连接字符串检索未加密的密码

azure - azure 上的 keystone 部署失败

java - 如何更改 Azure Functions 中的日志级别

c# - Azure Function 无法与 QueueTrigger 和非 void 返回值一起使用?

javascript - CORS 同步请求在 Firefox 中不起作用

javascript - 不存在 'Access-Control-Allow-Origin' header - 使用 AJAX 调用 Food2Fork API

Azure java webapp : security manager blocks network access