将应用程序角色分配给托管身份服务主体

时间:2021-03-16 20:22:07

标签: azure-active-directory azure-functions microsoft-graph-api azure-api-management

与演示的 here 一样,我想使用 AzureAD 保护 Azure Function 应用程序,并且只能从 Azure API 管理实例(启用系统分配的托管标识)调用/调用它。这工作正常。但是我真的想隔离对 API(函数应用程序)的访问。就目前而言,我租户中的任何应用程序都能够成功进行身份验证并调用 API。因此,我选择为该应用注册启用 user-assignment

所以基本上,有 1 个 API(Azure 函数)受 AzureAD 保护。然后有 1 个服务调用 API(Azure API 管理)。如果没有角色分配,我可以理解以下错误消息。

AADSTS501051: Application '<appId>'(<name of APIM managed-identity>) is not assigned to a role for the application '<appId2>'(<name of app registration for the Azure Functions app's EasyAuth feature>).

所以我在 API 的应用注册中创建了一个应用角色。可以在此处 (编辑:错误链接查看答案)中找到有关如何将此类角色分配给应用程序的常规指南。但是,这仅适用于手动创建的服务主体(读取:不是 MSI),因为这需要可以在门户 UI 中找到服务主体。与托管身份相关的任何事情都不是这种情况。

由于上面的链接还指出也可以使用 Graph API 完成分配,因此我尝试将其作为解决方法。

POST https://graph.microsoft.com/v1.0/users/{id}/appRoleAssignments
Content-Type: application/json

{
  "principalId": "principalId-value",
  "resourceId": "resourceId-value",
  "appRoleId": "appRoleId-value"
}

这不起作用,产生以下错误响应(我已尝试 appId 和 objectId 为 id/principalId/resourceId):

"Resource '<guid of principalId>' does not exist or one of its queried reference-property objects are not present."

您对可以做什么有什么建议吗?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

文档中的 MS-Graph 链接是错误的。它指的是将角色分配给用户,尽管暗示了链接文本正文中的应用程序。 This 是正确的参考。

<块引用>

POST /servicePrincipals/{objectId}/appRoleAssignments

还要确保,如果您使用个人帐户(例如,outlook.com、hotmail.com)创建了 Azure 订阅,则不要在图形调用中使用该用户的不记名令牌。而是在 AzureAD 中创建一个用户,分配适当的权限,并使用该帐户的令牌。