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

时间:2021-03-25 19:22:31

标签: azure-active-directory azure-functions azure-managed-identity azure-authentication

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

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

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

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

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

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

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

这是支持的场景吗?

2 个答案:

答案 0 :(得分:3)

是的,您可以,但是要将 MSI(本质上是服务主体)添加到企业应用程序的 Users and groups,与添加用户/组不同,您需要利用 {{3} }.

请按照以下步骤操作。

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

azure ad app role

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

请确保您已安装 enter image description here 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

AzureAD

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

这种情况下,你还有另外一种方式,就是enter image description here,然后把组加入到Users and groups中,这样MSI也可以调用这个函数了。

总之,您有两种解决方案,您可以选择首选方式。

  1. 利用应用程序角色

  2. 利用 AAD 集团

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

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

create a security group in AAD and add the MSI service principal as a member to it

答案 1 :(得分:1)

几个月前,我与 Azure 支持人员进行了类似的问题解决会议。

结论是:

  • 您可以将用户和组分配给服务主体/企业应用程序,但不能分配托管身份
  • 据我所知,使用免费 AAD 计划时您无法分配组
  • 如果您可以分配群组,则将托管身份添加到群组可能会起作用(我自己从未尝试过)