是否可以将系统托管标识分配给需要用户分配的 Azure AD 企业应用程序?

Is it possible to assign a system managed identity to an Azure AD Enterprise Application that requires user assignment?

我有一个 Azure Function 应用程序,它使用通过 Azure 门户配置的集成 Azure AD 身份验证。

通过“快速”模式设置,这将创建一个 Azure 应用程序注册以及企业应用程序。

默认情况下,此企业应用程序接受所有用户。所以这意味着租户中的所有用户都可以触发受保护的 Azure Functions,这不是我想要的。

我的目标是允许某些用户和租户中具有托管身份的某些 Azure 资源(例如应用服务)触发该功能。

所以我转到 Azure Function 应用程序的企业应用程序设置,将其属性更改为“需要用户分配”。然后在Users/Groups下,我可以添加允许认证的users/groups。

在这里我发现我只能添加普通的AAD用户。托管身份服务主体(即系统为我的应用服务分配的托管身份主体)未显示在列表中。

我没有尝试过用户分配的托管身份。但我更喜欢使用系统分配的托管身份。

这是受支持的方案吗?

几个月前,我在 Azure 支持下解决了类似的问题 session。

结论是:

  • 您可以将用户和组分配给服务 Principal/Enterprise 应用程序,但不能分配托管身份
  • 据我所知,在免费 AAD 计划中您无法分配组
  • 如果您可以分配组,将托管标识添加到组中可能会起作用(我自己从未尝试过)

是的,您可以,但是要将 MSI(本质上是服务主体)添加到企业应用程序的 Users and groups,这与添加 user/group 不同,您需要利用azure ad app role.

请按照以下步骤操作。

1.Navigate 到门户中的 Azure Active Directory -> App registrations -> 使用过滤器 All applications 搜索你的函数应用程序名称 -> 单击它 -> App roles | Preview -> Create app role -> 创建如下角色 -> Apply.

2.Use 下面的 powershell 将应用程序角色赋予您的 MSI(托管身份),替换 <appservice-name><functionapp-name>.

确保您已经安装了 AzureAD powershell 模块并且有足够的权限分配应用程序角色(此步骤在 azure 门户中不可用)。

Connect-AzureAD
$MSI = Get-AzureADServicePrincipal -Filter "displayName eq '<appservice-name>'"
$funapp = Get-AzureADServicePrincipal -Filter "displayName eq '<functionapp-name>'"
$PermissionName = "Function.Test"
$approle = $funapp.AppRoles | Where-Object {$_.Value -eq $PermissionName}
New-AzureADServiceAppRoleAssignment -ObjectId $MSI.ObjectId -PrincipalId $MSI.ObjectId -ResourceId $funapp.ObjectId -Id $approle.Id

完成上述步骤后,导航到 Users and groups,您会发现 MSI 已添加到其中。

这样的话,你还有另外一个办法,就是create a security group in AAD and add the MSI service principal as a member to it,然后把组加到Users and groups,那么MSI也可以调用函数了

综上所述,您有两种解决方案,您可以选择首选方式。

  1. 利用应用角色

  2. 利用 AAD 集团

要成功调用该函数,还要确保您使用 Anonymous 设置了该函数。

导航到函数应用程序中的 httptrigger,将 Authorization level 设置为 Anonymous,因为我们已经配置了 AAD 身份验证。

您可以通过执行此 AAD 脚本为企业应用程序添加托管标识

New-AzureADServiceAppRoleAssignment
   -ObjectId {MANAGED-IDENTITY-ID}
   -Id {YOUR-APPROLE-ID}
   -PrincipalId {MANAGED-IDENTITY-ID}
   -ResourceId {ENTERPRISE-APP-OBJECT-ID}