Можно ли использовать параметр строки запроса ключа подписки при выполнении 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 во входящий запрос. Я буду расследовать и сообщить вам.