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

时间:2019-12-17 13:23:57

标签: azure powershell azure-active-directory azure-powershell service-principal

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

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

1 个答案:

答案 0 :(得分:0)

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

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

尤其是在测试时,重要的是先删除同一应用程序角色的现有应用程序角色分配,然后稍等一会儿(以确保所做的更改已被复制),然后再尝试执行此操作。


  

以下是使用Azure AD PowerShell 读取应用角色分配并提供您自己的访问令牌时适用的重要说明。

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

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

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

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

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

要增加一些困惑,添加或删除应用程序角色分配时不需要考虑这个问题。 {id}New-AzureADServiceAppRoleAssignment都可以与Remove-AzureADServiceAppRoleAssignment一起调用,标识已分配的服务主体或资源应用程序的服务主体,命令将按预期执行。

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