1

我们使用 API 管理来公开几个 API。我们公开的 API 之一被配置为 SOAP-passthrough API,但我们面临一些关于 APIM 身份验证的问题。

当我们使用Ocp-Apim-Subscription-Key标头传递查询字符串时,一切正常,API 返回的内容正确。

当我们使用subscription-key查询字符串参数时,API 返回 401 Unauthorized。我在 Postman 中测试了这种行为,改变发送订阅密钥的方式会导致这种行为。

此 API 的一个实现细节是它公开现有的 WSDL 并通过策略将此 SOAPAction 路由到 Azure 函数。在该函数的 Application Insights 中,我可以验证该函数在我得到 401 时从未被调用,但在我成功调用时被调用(使用标头)。

这是正常行为吗?我做错了吗?还是 APIM 中的错误?

4

2 回答 2

1

这可能是我们为 SOAP Passthrough 进行路由的方式的问题。您会注意到,在 API 设置中,我们添加了一个查询参数来标识操作将匹配到的 SoapAction。将 SoapAction 参数添加到入站请求时,您的 api 键查询参数可能会被覆盖。我会调查并让你知道。

于 2017-09-14T13:25:18.130 回答
0

我们目前使用以下策略解决此问题。我们发送一个请求并将该请求的响应设置为此 api 的响应,而不是更改策略中的后端服务器 url。您可以在下面找到我们的策略,该策略与查询字符串中的订阅密钥一起使用。

<policies>
    <inbound>
        <base />
        <send-request mode="copy" response-variable-name="response" timeout="20" ignore-error="false">
            <set-url>{{BackendServer_URL}}</set-url>
        </send-request>
        <!--return-response response-variable-name="reponse" /-->
        <choose>
            <!-- If StatusCode is not OK, return Unauthorized with the reason. -->
            <when condition="@(((IResponse)context.Variables["response"]).StatusCode != 200)">
                <return-response response-variable-name="reponse">
                    <set-status code="401" reason="Unauthorized" />
                    <set-body>@(((IResponse)context.Variables["response"]).Body.As<string>())</set-body>
                </return-response>
            </when>
            <otherwise>
                <return-response response-variable-name="reponse">
                    <set-status code="200" />
                    <set-header name="Content-Type" exists-action="override">
                        <value>text/xml; charset=utf-8</value>
                    </set-header>
                    <set-body>@(((IResponse)context.Variables["response"]).Body.As<string>())</set-body>
                </return-response>
            </otherwise>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
于 2017-09-26T12:58:24.643 回答