Azure API管理和功能应用程序-仅允许APIM访问具有用户分配标识的应用程序

roqulrg3  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(115)

目前,我正在使用一个后端连接,在头部中有一个函数键来访问我的函数应用程序。我不需要存储和传递这些键,我想使用一个托管身份来隐式地授予对我的API管理的访问权限,并拒绝任何直接调用。
我已经阅读了这篇文章,似乎我应该能够通过以下方式做到这一点:
1.创建用户管理身份
1.为我的所有函数应用程序给予它Contributor角色
1.将其分配给我的API管理
1.更新API策略以包括以下内容:

<authentication-managed-identity
   resource="${function_id}"
   output-token-variable-name="msi-access-token"
   ignore-error="false" 
   client-id="#{function_access_client_id}"
/>

在哪
a.“function_id”是我的函数应用程序的ID(也尝试了https://management.azure.com/)B.“function_access_client_id”是我的用户管理身份的ID
这就是我现在困惑的地方。

  • 如果对于(a)我使用https://management.azure.com/,那么我能够成功地获得令牌,但它无法通过功能应用程序的“身份验证”进行身份验证。
  • 如果对于(a)我使用函数app的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变量设置为函数app的Authentication Identity Provider的值,我就可以实现这一点。我还注意到,如果我在这一工作之后从API管理中删除用户管理的身份,那么它就会失败,因为它说APIM没有启用管理身份。
我想我只是真的搞不懂这个逻辑。如果这个设置正确,那就意味着我需要
1.一个用户分配了一个托管身份,表示我可以访问应用程序。这个身份可以使用它的客户端ID创建自己的JWT,但我们不使用它
1.需要JWT的函数应用程序上的身份验证
1.引用步骤2中列出的身份验证的客户端ID的策略。
这个设置是错误的吗?它工作正常,只是感觉很奇怪。用户管理身份的意义是什么?

42fyovps

42fyovps1#

您在此处描述的方法将允许您“管理”Azure函数资源,而不是调用函数本身。
这里更好的方法是在Function App上设置IP限制,以便只允许来自APIM的调用,如此处所述。
请注意,您可以将功能应用程序内置的身份验证设置为匿名,因为您不想再使用功能键,而只允许来自APIM的请求。

相关问题