是否可以使用 PowerShell 中的服务主体将角色和范围分配给新创建的应用程序?

Is it possible to assign roles and scopes to a newly created app using a Service Principal in PowerShell?

我编写了一个模块来在 Azure AD 中创建应用程序注册并分配角色和范围。当使用我自己的凭据作为全局管理员连接到 Azure AD 时,它可以工作,但是当使用带有证书指纹的服务主体时,它 returns 以下

PS C:\WINDOWS\system32> New-AzureADServiceAppRoleAssignment -ObjectId "GUID" -PrincipalId "GUID"
 -ResourceId "GUID" -Id "GUID"

New-AzureADServiceAppRoleAssignment : Error occurred while executing NewServicePrincipalAppRoleAssignment
Code: Request_BadRequest
Message: One or more properties are invalid.
RequestId: 8ab86d25-3963-4d67-a112-44285bc74c82
DateTimeStamp: Tue, 17 Dec 2019 13:04:10 GMT
HttpStatusCode: BadRequest
HttpStatusDescription: Bad Request
HttpResponseStatus: Completed
At line:1 char:1
+ New-AzureADServiceAppRoleAssignment -ObjectId "GUID...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureADServiceAppRoleAssignment], ApiException
    + FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.NewServicePrincipalAppRoleAssignment
 at <ScriptBlock>, <No file>: line 1

是的,这是可能的,并且对于创建应用程序角色分配,您在问题中显示的内容应该有效。

您可能收到此(不是特别有用)错误消息的原因之一是服务主体是否已被分配此应用程序角色。

尤其是在测试时,请务必先删除同一应用角色的现有应用角色分配,然后稍等片刻(以确保更改已复制),然后再尝试再次执行此操作。


Below is an important note applicable when reading app role assignments using Azure AD PowerShell and providing your own access token.

cmdlet Get-AzureADServiceAppRoleAssignmentGet-AzureADServiceAppRoleAssignedTo 调用 Azure AD Graph API。 Azure AD Graph 有一个奇怪的怪癖,它会根据用于获取访问令牌的应用程序 ID 是否为 Microsoft 拥有的应用程序注册(例如,Microsoft 拥有的 Azure AD PowerShell 应用程序注册,在 Connect-AzureAD),或使用常规客户拥有的应用程序注册获得的访问令牌(例如,当使用 -AadAccessToken 提供您自己的访问令牌时)。

Connect-AzureAD 连接时(不传递访问令牌):

  • Get-AzureADServiceAppRoleAssignment -ObjectId "{id}" returns 应用程序角色分配,其中 {id} 是分配的服务主体的对象 ID(即已被授予仅限应用程序权限的应用程序)。
  • Get-AzureADServiceAppRoleAssignedTo -ObjectID "{id}" returns 所有应用角色分配,其中 {id} 是资源服务主体(即公开相关应用角色的应用)的对象 ID。

但是,当与 Connect-AzureAD -AadAccessToken "{token}" ... 连接时(其中 {token} 是 Azure AD Graph API 的访问令牌,通过客户拥有的应用程序注册获得),行为相反:

  • Get-AzureADServiceAppRoleAssignment -ObjectId "{id}" returns 所有应用角色分配,其中 {id} 是资源服务主体(即公开相关应用角色的应用)的对象 ID。
  • Get-AzureADServiceAppRoleAssignedTo -ObjectID "{id}" returns 应用程序角色分配,其中 {id} 是分配的服务主体的对象 ID(即已被授予仅限应用程序权限的应用程序)。

更令人困惑的是,在添加或删除应用程序角色分配时,不需要考虑这个问题。 New-AzureADServiceAppRoleAssignmentRemove-AzureADServiceAppRoleAssignment 都可以通过 -ObjectId 来调用,以识别分配的服务主体或资源应用程序的服务主体,命令将按预期执行。

最后一点:此问题已在 Microsoft Graph API 测试版中的等效 API 中得到解决。当基于 Microsoft Graph 的 Microsoft Graph-based PowerShell module 发布时,您可能希望迁移到该模块,这将具有一致的行为。