Можно ли использовать параметр строки запроса ключа подписки при выполнении SOAP-управления Azure API?

Мы используем управление API, чтобы выставить несколько API. Один из представленных нами API-интерфейсов настроен как сквозной API-интерфейс SOAP, но мы сталкиваемся с некоторыми проблемами, связанными с аутентификацией APIM.

Когда мы используем Ocp-Apim-Subscription-Key заголовок для передачи строки запроса, все работает правильно, и API возвращает его содержимое правильно.

Когда мы используем subscription-key Параметр строки запроса, который API возвращает 401 Unauthorized. Я проверил это поведение в Postman, и изменение способа отправки ключа подписки приводит к такому поведению.

Особенность реализации этого API заключается в том, что он предоставляет существующий WSDL и направляет это SOAPAction в функцию Azure через политику. В Application Insights функции я могу убедиться, что функция никогда не вызывается, когда я получаю 401, но она вызывается, когда я получаю успешный вызов (используя заголовок).

Это нормальное поведение? Я делаю что-то неправильно? Или это ошибка в APIM?

2 ответа

Решение

В настоящее время мы используем обходной путь для решения этой проблемы со следующей политикой. Вместо изменения URL-адреса внутреннего сервера в политике мы отправляем запрос и устанавливаем ответ на этот запрос в качестве ответа для этого API. Ниже вы можете найти нашу политику, которая работает с ключом подписки в строке запроса.

<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>

Это может быть связано с тем, как мы выполняем маршрутизацию для SOAP Passthrough. В настройке API вы заметите, что мы добавляем параметр запроса для определения SoapAction, которому будет соответствовать операция. Возможно, ваш параметр запроса API-ключа перезаписывается при добавлении параметра SoapAction во входящий запрос. Я буду расследовать и сообщить вам.

Другие вопросы по тегам