CORS 预检请求不适用于 Azure API 管理

问题描述 投票:0回答:4

我有 2 个 Azure 网站(ASP.NET MVC 5 和 ASP.NET WebApi 2)。 MVC 网站有一些 jQuery 尝试将 CORS 请求发布到 WebApi。如果直接连接到 WebApi,它就可以正常工作。但是,当尝试通过 API 管理连接时,它不起作用。

我在 Chrome 中遇到的错误是:

XMLHttpRequest 无法加载 https://XXXXXX.azure-api.net/api/search。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“https://YYYYYY.azurewebsites.net”。

我排除了 WebApi 配置的问题,因为正如我所说,它可以直接工作。

以下是我的政策:

<policies>
    <inbound>
        <cors>
            <allowed-origins>
                <origin>*</origin>
                <!-- allow any -->
            </allowed-origins>
            <allowed-headers>
                <header>accept</header>
                <header>accept-encoding</header>
                <header>access-control-request-headers</header>
                <header>access-control-request-method</header>
                <header>connection</header>
                <header>content-type</header>
                <header>host</header>
                <header>origin</header>
                <header>referer</header>
                <header>user-agent</header>
            </allowed-headers>
            <expose-headers>
                <header>access-control-allow-headers</header>
                <header>access-control-allow-origin</header>
                <header>cache-control</header>
                <header>content-length</header>
                <header>date</header>
                <header>expires</header>
                <header>pragma</header>
                <header>server</header>
                <header>set-cookie</header>
                <header>x-aspnet-version</header>
                <header>x-powered-by</header>
            </expose-headers>
        </cors>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
</policies>

有什么想法吗?

azure cors azure-api-management
4个回答
2
投票

CORS 策略的预期用途是当您的后端不支持 CORS 的情况。在这种情况下,您可以放入此策略,它将回复 OPTION 请求,而不将它们转发到您的后端。您可以使用此策略来决定处理 CORS 的来源/标头/方法。

或者,如果您的后端已经支持 CORS,并且您认为在 APIM 级别处理 CORS 流没有任何好处,您可以只代理整个流。为此,您应该删除 CORS 策略,并使用 OPTIONS 方法在 APIM 中的 API 中创建一个新操作,以便 OPTIONS 请求正常转发到后端。


1
投票

在花了数周时间解决这个问题并一无所获之后,我(在 Microsoft 支持的帮助下)发现了 Azure API 管理中的一个错误。如果您有多个 API,并且其中一个没有 URL 后缀(即使它不是失败的 API),请检查其 CORS 策略。我们放入 Azure API 管理中的第一个 API 除了 GET 之外没有任何方法,因此我们设置 CORS 策略仅允许 GET 和 OPTION。然而,存在的错误似乎使所有入站飞行前请求路由到没有 URL 后缀的 API。因此,我能够通过向不相关 API 的 CORS 策略添加 PUT(以及 POST,以达到良好的措施)来解决我的问题。

TL;DR:检查以确保没有 URL 后缀的 API 的 CORS 策略允许失败的方法。

希望这可以挽救某人的理智。


0
投票

我从 APIM 收到低于预检错误的信息,发现问题是我的政策

<method>*</method>
实际上不起作用。更改策略以显式添加所有 HTTP 动词(如下所示)已经解决了我的问题。

<allowed-methods preflight-result-max-age="300">
            <method>OPTIONS</method>
            <method>GET</method>
            <method>POST</method>
            <method>PUT</method>
            <method>PATCH</method>
            <method>DELETE</method>
        </allowed-methods>


0
投票

对我来说,问题在于全局 APIM 策略优先于在 API 级别配置的策略。我的 API 具有开放的 CORS 策略,但 APIM 实例具有限制对特定域的访问的全局策略。

您可以通过单击“所有 API”位置来访问全局设置,然后从那里编辑 CORS 策略:

© www.soinside.com 2019 - 2024. All rights reserved.