【问题标题】:Insufficient privileges assigning Azure Active Directory premissions to an MSI enabled Azure function?将 Azure Active Directory 权限分配给启用 MSI 的 Azure 功能的权限不足?
【发布时间】:2018-09-19 15:56:47
【问题描述】:

我们在同一个目录中有两个 azure 资源。 Azure API 管理和 Azure 函数背后的一组 webAPI API。我们希望 azure 函数能够调用 API。如How to use managed identities for App Service and Azure Functions 中所述,我们已在 azure 功能上启用 MSI。我们在 AAD 中为 API 创建了应用注册,创建了要访问的角色权限。在Calling your APIs with Azure AD Managed Service Identity using application permissions 之后,我们在尝试将权限/角色分配给 azure 函数时遇到错误: 在PowerShell中:

New-AzureADServiceAppRoleAssignment -ObjectId 8XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -Id 3XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -PrincipalId 8XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -ResourceId 9XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

New-AzureADServiceAppRoleAssignment : Error occurred while executing NewServicePrincipalAppRoleAssignment
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
HttpStatusCode: Forbidden
HttpStatusDescription: Forbidden
HttpResponseStatus: Completed
At line:1 char:1
+ New-AzureADServiceAppRoleAssignment -ObjectId 8XXXXXX-XXXX-XXXX-XXXX ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureADServiceAppRoleAssignment], ApiException
    + FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.NewServ
   icePrincipalAppRoleAssignment

给我们一个权限错误,即使 AAD 管理员(我认为是 AAD DC 管理员的成员)运行它也是如此。有没有人遇到过这个?为什么这会引发权限错误?我们已经验证了 3 个不同的人的 id 是正确的。

【问题讨论】:

    标签: azure azure-active-directory azure-functions azure-api-management azure-managed-identity


    【解决方案1】:

    您可能面临的问题是,尽管将您的应用注册命名为与启用 MSI 的应用相同的名称,但两者最终在 AAD 中代表不同的服务主体。 Using app registrations with MSI isn't currently supported.

    尝试改用 MSI 身份的对象 ID 运行 powershell 命令。我能够让它工作,并授予我启用 MSI 的应用访问 Graph Api 的权限。

    这是我用来分配函数应用所需的 GraphApi 角色的 PS:

    $functionAppName = "My-FANCY-FUNC"
    
    $context = Get-AzureRmContext -ErrorAction SilentlyContinue #this lets you search AAD for func
    
    if(!$context){
        $login = Connect-AzureRmAccount  | Out-Null
        Connect-AzureAD #needed this for Graph API
        $context = $login
    } else { Write-Host "Login session already established for " $context.Subscription.SubscriptionName }
    
    #get the SP associated with the MSI
    $MSIPrincipal = Get-AzureRmADServicePrincipal -SearchString $functionAppName | Where-Object DisplayName -eq $functionAppName
    
    #get the SP associatesd with the MS Graph
    $graph = Get-AzureADServicePrincipal -All $true | ? { $_.DisplayName -match "Microsoft Graph" }
    
    #find the target app roles in the graph
    $targetRoles = $graph.AppRoles | Where-Object Value -in "Group.ReadWrite.All", "Directory.ReadWrite.All"
    
    #iterate throgh the known roles and add the MSI SP to them
    $targetRoles | ForEach-Object {New-AzureADServiceAppRoleAssignment -Id $_.Id -PrincipalId $MSIPrincipal.Id -ObjectId $MSIPrincipal.Id -ResourceId $graph.ObjectId}
    

    根据您的问题,我怀疑此行将返回多个实体:

    Get-AzureRmADServicePrincipal -SearchString $functionAppName | Where-Object DisplayName -eq $functionAppName
    

    删除无关的应用注册应该可以清除

    【讨论】:

    • 感谢您的回复。不幸的是,我正在传递您指示的值:New-AzureADServiceAppRoleAssignment -ObjectId AzureFunction(MSIPrincipal) -Id AppRole(在应用注册清单中创建的应用角色 ID) -PrincipalId AzureFunction(MSIPrincipal) -ResourceId AzureAPI(AAD Principal)跨度>
    • 只是为了澄清,唯一的应用注册是针对 API 的。该函数仅通过 MSI 注册。
    • 你能分享一下 PS 脚本的 auth 部分吗?您使用的是 Connect-AzureAD 还是 Connect-AzureRmAccount 或两者都使用?
    • 老实说,没有脚本。我们必须这样做一次,所以我们手动获取了上面的 New-AzureADServiceAppRoleAssignment 调用所需的 ID。
    • 如果你只是在控制台中输入它,它就不会工作。您需要针对 AAD 和 Azure 对会话进行身份验证。我提供的脚本将起作用或将帮助您了解用户缺乏权限的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多