目前,我正在使用标头中带有功能键的后端连接来访问我的功能应用程序。我不想存储和传递这些密钥,而是想使用托管身份隐式授予对我的 API 管理的访问权限,并拒绝任何直接调用。
我已经通读了this,看来我应该可以通过执行以下操作来做到这一点:
<authentication-managed-identity
resource="${function_id}"
output-token-variable-name="msi-access-token"
ignore-error="false"
client-id="#{function_access_client_id}"
/>
在哪里
一个。 “function_id”是我的函数应用程序的ID(也试过https://management.azure.com/) b. “function_access_client_id”是我的用户管理身份的 ID
这就是我现在感到困惑的地方。
"errorResponse": "System.InvalidOperationException: [MSAL] Authentication failed for ClientId: <user managed client id> Certificate: <certificate> AuthorizationUrl: https://login.windows.net/<id> resourceId: /subscriptions/<subscription>/resourceGroups/<res group>/providers/Microsoft.Web/sites/<function app name> ---> Microsoft.Identity.Client.MsalServiceException: AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope /subscriptions/<subscription>/resourceGroups/<res group>/providers/Microsoft.Web/sites/<function app>/.default is not valid.
如果我将
client_id
变量设置为函数应用程序的身份验证身份提供程序的值,我就可以完成这项工作。我还注意到,如果我在这个工作之后从 API 管理中删除用户管理的身份,那么它将失败,因为它说 APIM 没有启用管理身份。
我想我真的很困惑这个逻辑。如果设置正确,那意味着我需要
这个设置错了吗?它的工作原理只是感觉很奇怪。用户管理身份有什么意义?
您在此处描述的方法将使您“管理”Azure 函数资源,而不是调用函数本身。
这里更好的方法是在您的 Function App 上设置 IP 限制,以仅允许来自 APIM 的调用,如此处所述。
请注意,您会将函数应用程序的内置身份验证设置为匿名,因为您不想再使用函数键,而只允许来自 APIM 的请求。