我在 Azure 中配置并运行了 Azure Durable Functions Orchestration 功能。
我还配置了一个 Azure API 管理服务来公开编排功能。
我可以通过 Azure API 管理服务成功调用编排函数,并获取接受的 202 和带有状态查询 GET URL 的 Location 标头以进行轮询,直到编排函数完成/失败等。
如果我直接将相关状态查询GET URL调用到azure函数:例如 https://some-ulr-to-the-function-app.azurewebsites.net/runtime/webhooks/durabletask/instances/cc970c6e2cb2426f99629c17cdd12345?code=q4NnjCbKTdBdH6712345dm4tnRRlYEAZ2tnZUliepmIKAzFuNUC0 MQ==
我收到了 200 响应以及预期的编排当前状态
如果我尝试通过 Azure API 管理服务公开此端点并尝试获取状态,我会收到 403 禁止响应。例如 https://some-ulr-to-apim-service.azure-api.net/runtime/webhooks/durabletask/instances/cc970c6e2cb2426f99629c17cdd12345?code=q4NnjCbKTdBdH6712345dm4tnRRlYEAZ2tnZULiepmIKAzFuNUC0MQ==
那么,/runtime/webhooks/durabletask/instances/cc970c6e2cb2426f99629c17cdd12345?code=q4NnjCbKTdBdH6712345dm4tnRRlYEAZ2tnZUliepmIKAzFuNUC0MQ==,端点可以通过Azure API管理服务公开吗? 如果是这样,我应该如何配置才能通过 Azure API 管理服务公开此端点?
我已尝试通过 Azure API 管理服务的托管标识直接访问底层存储帐户和表(其中保存此实例数据),但仍然收到 403 Forbidden 结果。
在 Application Insights 中,我可以看到 Azure API 管理服务已按预期将请求传递给函数应用程序,但结果为 403。
任何帮助将不胜感激
@in-pv 和我发现了问题的解决方案。
总结
如果通过 Azure API 管理服务查询持久函数的 statusQueryGetUri,请确保该 API 请求中引用的后端其授权凭证中未定义自定义标头。
详情
为 Azure Function App 设置 API 管理服务后端时,Azure 将在后端的授权凭据中配置一个名为 x-functions-key 的标头。通过 API 管理服务与函数应用交互时需要此标头,其值应该是您的函数应用密钥。如果您排除此标头,则在尝试通过 API 管理服务调用您的 azure 函数时,您将收到 401 Unauthorized 错误。
如果在查询持久函数的statusQueryGetUri时包含此标头,持久函数将返回403错误。必须从 API 管理服务后端授权凭证中删除标头才能调用持久功能状态端点。
这种情况有什么解决方案吗?如果我删除标题 x-function-key 它会给出 401。