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

tha*_*ssd 7 azure-active-directory azure-functions azure-authentication azure-managed-identity

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

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

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

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

因此,我转到 Azure Function 应用程序的企业应用程序设置,将其属性更改为“需要用户分配”。然后在“用户/组”下,我可以添加允许进行身份验证的用户/组。

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

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

这是受支持的场景吗?

Joy*_*ang 9

是的,您可以,但是要将 MSI(本质上是服务主体)添加到Users and groups企业应用程序中,它与添加用户/组不同,您需要利用azure ad app 角色

请按照以下步骤操作。

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

在此输入图像描述

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

确保您已安装AzureADpowershell 模块并具有足够的权限来分配应用程序角色(此步骤在 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

在这种情况下,你还有另一种方法,只需在AAD中创建一个安全组并将MSI服务主体添加为成员,然后将该组添加到AAD中Users and groups,那么MSI也将能够调用该函数。

所以总而言之,你有两种解决方案,你可以选择你喜欢的方式。

  1. 利用应用程序角色

  2. 利用 AAD 集团

要成功调用该函数,还请确保使用 来设置该函数Anonymous

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

在此输入图像描述

  • 我只是想补充一点,我尝试了“将 MI 添加到安全组,然后将组分配给企业应用程序”方法,但它不起作用。这可能是因为以这种方式添加的主体无法像用户在常规基于 Web 的工作流程中那样“同意”应用程序。使用 Powershell 并将 MI 分配给应用程序角色确实有效。 (2认同)