Azure AD组和用户分配的托管身份

时间:2020-07-10 04:27:28

标签: c# azure azure-active-directory azure-functions azure-web-app-service

如何允许用户分配的托管身份(UAMI)到R / W Azure AD组? 我有一个以UMAI运行的.Net Core 3.1 Azure Function应用程序。该应用程序需要能够对Azure AD组进行读写。我的代码通过笔记本电脑上的应用程序注册服务负责人运行。在Azure中,UAMI是订阅提供者,并且与FunctionApp相关联。

这在本地和Azure中有效:

<i class="feather icon-edit-1 "></i>

在本地工作,在Azure上失败:

        var azureFluentClient = AzureAuthenticator.AzureFluentClient(context._ILogger, context.ExecutionContext,context.Settings);
        var resourceGroups = await azureFluentClient.ResourceGroups.ListAsync();

错误:

        var azureFluentClient = AzureAuthenticator.AzureFluentClient(context._ILogger, context.ExecutionContext, context.Settings);
        var groups = await azureFluentClient.AccessManagement.ActiveDirectoryGroups.GetByNameAsync("AAA1");

区别在于本地运行有一个具有 API权限的应用程序注册:Azure Active Directory图形/目录.ReadWrite.All 。我认为问题在于没有与UAMI关联的应用程序注册,因此没有办法授予权限。

2 个答案:

答案 0 :(得分:0)

是的,用户分配的身份是与AD App无关的服务主体。

在这种情况下,如果要授予Azure AD组的R / W权限,则可以直接为其赋予管理员角色Groups administrator

在门户中导航至Azure Active Directory-> Roles and administrators ->选择Groups administrator-> Add assignments->搜索身份名称并将其添加。

答案 1 :(得分:0)

解决方案: FunctionApp的用户分配的托管身份(UAMI)需要

  • 分配UAMI订阅贡献者角色(我的代码不仅仅只是查找AAD组,而是一行代码)
  • 分配UAMI AD目录读者角色(在生产环境中可以接受)
  • 将UAMI作为所有者添加到要操纵的广告组(添加/删除成员)

请注意,UAMI将无法创建,分配,删除或管理由于所有权未明确授予许可的任何广告组。

由于AD延迟/缓存了对受管理身份的更改(更改可能要花一些时间才会出现,使我迷惑于兔子的洞),所以我花费了大量时间。我写了这个脚本来帮助确定我的FunctionApp的实际要求。运行此脚本后,我将运行FunctionApp测试方法。由于Identity每次都是新的,因此不存在缓存或延迟的实现。

Connect-AzureRmAccount -TenantId $tenantId
Connect-AzureAD -TenantId $tenantId

Set-AzureRmContext  -TenantId $tenantId -SubscriptionId $subscriptionId

#Drops/recreates manged Identity
Set-AzureRmWebApp -AssignIdentity $false -ResourceGroupName "rg01" -Name "fa01" 
Set-AzureRmWebApp -AssignIdentity $true -ResourceGroupName "rg01" -Name "fa01" 

$current = Get-AzureRmWebApp -ResourceGroupName "rg01" -Name "fa01"
$objectId = $current.Identity.PrincipalId

#Add functionApp Identity to Contributor
$role = Get-AzureRmRoleDefinition -Name "Contributor"
New-AzureRMRoleAssignment -ObjectId $objectId -RoleDefinitionName "Contributor"  -Scope "/subscriptions/{subscription guid}"

#Assign functionApp Identity to AD Role 'Directory Readers'
$roleDefinition = Get-AzureADMSRoleDefinition -Filter "displayName eq 'Directory Readers'"
$roleAssignment = New-AzureADMSRoleAssignment  -RoleDefinitionId $roleDefinition.Id -PrincipalId $objectId  -ResourceScope "/"

#Assign functionApp Identity to AD Group
$group = Get-AzureADGroup  -Filter "DisplayName eq  'adgroup01'"
Add-AzureADGroupOwner -ObjectId $group.ObjectId -RefObjectId $objectId