无法使用 Azure APIM 交互式门户将测试请求发送到后端 API

Unable to send test requests to backend APIs using the Azure APIM interactive portal

使用 Azure 门户,我无法将测试请求发送到 Echo API(以及所有其他后端 API)。

发送请求时,出现以下错误:

HTTP/1.1 401 Access Denied
cache-control: private, s-maxage=0
content-length: 152
content-type: application/json
date: Tue, 12 Apr 2022 05:13:28 GMT
vary: Origin
www-authenticate: AzureApiManagementKey realm="https://AAAA.azure-api.net/echo",name="Ocp-Apim-Subscription-Key",type="header"
    {
    "statusCode": 401,
    "message": "Access denied due to missing subscription key. Make sure to include subscription key when making requests to an API."
}

当我勾选“绕过 CORS 代理”复选框并通过 Postman 时,请求工作正常。

我有以下全球入站 CORS 策略:

<policies>
    <inbound>
        <cors allow-credentials="true">
            <allowed-origins>
                <origin>https://AAAA.developer.azure-api.net</origin>
                <origin>https://AAAA.azure-api.net</origin>
            </allowed-origins>
            <allowed-methods preflight-result-max-age="300">
                <method>*</method>
            </allowed-methods>
            <allowed-headers>
                <header>*</header>
            </allowed-headers>
            <expose-headers>
                <header>*</header>
            </expose-headers>
        </cors>
    </inbound>
    <backend>
        <forward-request />
    </backend>
    <outbound />
    <on-error />
</policies>

以及在 Echo API.

上设置的入站 base 策略

我以前没有遇到过这个问题。在 APIM 门户中提交测试请求时如何避免 CORS 错误?

HTTP/1.1 401 Access Denied
www-authenticate: AzureApiManagementKey realm="https://AAAA.azure-api.net/echo",name="Ocp-Apim-Subscription-Key",type="header"
"message": "Access denied due to missing subscription key. Make sure to include subscription key when making requests to an API."

在这个Troubleshooting Steps of Unauthorized errors (401) while invoking APIs in Azure里面,说的很清楚:

  • 由于错误Ocp-Apim-Subscription-Key,出现此错误

创建 APIM 时,Echo API 默认订阅 built-in。 每个订阅都有两个订阅密钥可以使用。

场景 1:

默认情况下,Echo API 已注册到 Built-in all-access 订阅,因此在匹配订阅密钥之前它将完美运行:

场景二:

创建 APIM 实例时,默认情况下还有 2 个产品订阅,即 Starter 和 Unlimited。

当 API 订阅该产品订阅时,传入 header 的订阅密钥应与订阅菜单中可用的原始产品订阅密钥相匹配。

这里,Echo API 订阅了产品 Starter 和 Unlimited,如第一张图片所示。 该产品订阅已授予一些权限,称为管理员、开发人员和来宾。其中任何一个都应该让用户访问 API 订阅了这些产品。

在第 3 个图像中,您可以看到有 API 订阅了 Echo API 等入门产品。

如果上述任何解决方法均未解决问题,请参阅提供的故障排除步骤文档,其中显示了产生此特定错误的所有原因 401 Unauthorized and Missing the Subscription Key连同决议。

ByPass CORS 选项允许来自任何域的请求。有时,允许 cross-domain 访问也可以解决问题。尝试下面给出的 Azure Cross-domain 策略以允许从 'any' 域访问(您也可以指定您的域)。

<cross-domain>
<cross-domain-policy>
    <allow-http-request-headers-from domain='*' headers='*' />
</cross-domain-policy>

有关详细信息,请参阅有关管理跨域访问的 MS 文档:https://docs.microsoft.com/en-us/azure/api-management/api-management-cross-domain-policies

我已就此与 Microsoft 进行了接触,他们正在调查此问题。根据 MS 的初步调查,“Microsoft Defender for Cloud Apps”创建了一个代理来拦截所有从 Azure 门户发出的请求,并且 MCAS 代理似乎正在从传出请求中删除或修改 headers,从而导致此行为。Microsoft已指向以下文档以供参考:Troubleshooting - What is cas.ms, mcas.ms, or mcas-gov.us?。MS 已告知他们没有任何修复的 ETA,并且他们正在进一步调查。他们的建议是检查绕过 CORS 代理选项作为解决方法暂时.