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

问题描述 投票:0回答:1

目前,我正在使用标头中带有功能键的后端连接来访问我的功能应用程序。我不想存储和传递这些密钥,而是想使用托管身份隐式授予对我的 API 管理的访问权限,并拒绝任何直接调用。

我已经通读了this,看来我应该可以通过执行以下操作来做到这一点:

  1. 创建用户管理身份
  2. 为我所有的功能应用程序赋予贡献者角色
  3. 将其分配给我的 API 管理
  4. 更新 API 政策以包括以下内容:
<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

这就是我现在感到困惑的地方。

  • 如果对于 (a) 我使用 https://management.azure.com/,那么我能够成功获得令牌,但它无法针对功能应用程序的“身份验证”进行身份验证。
  • 如果对于 (a),我使用函数应用程序的 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 没有启用管理身份。

我想我真的很困惑这个逻辑。如果设置正确,那意味着我需要

  1. 用户分配了托管身份,表示我可以访问该应用程序。这个身份可以使用它的客户端 ID 创建它自己的 JWT,但我们不使用它
  2. 需要 JWT 的功能应用程序的身份验证
  3. 引用步骤 2 中列出的身份验证的客户端 ID 的策略。

这个设置错了吗?它的工作原理只是感觉很奇怪。用户管理身份有什么意义?

azure azure-functions azure-api-management azure-identity
1个回答
0
投票

您在此处描述的方法将使您“管理”Azure 函数资源,而不是调用函数本身。

这里更好的方法是在您的 Function App 上设置 IP 限制,以仅允许来自 APIM 的调用,如此处所述

请注意,您会将函数应用程序的内置身份验证设置为匿名,因为您不想再使用函数键,而只允许来自 APIM 的请求。

© www.soinside.com 2019 - 2024. All rights reserved.