2

I have written a module to create an app registration in Azure AD and assign roles and scopes. When using my own credentials as a Global Administrator to connect to Azure AD it works but when using a Service Principal with certificate thumbprint it returns the following

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
4

1 回答 1

0

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

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

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


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

cmdletGet-AzureADServiceAppRoleAssignmentGet-AzureADServiceAppRoleAssignedTo调用 Azure AD Graph API。Azure AD Graph 有一个特殊的怪癖,它根据用于获取访问令牌的应用 ID 是否是 Microsoft 拥有的应用注册(例如 Microsoft 拥有的 Azure AD PowerShell 应用注册,在 期间默认使用Connect-AzureAD)表现出不同的行为,或使用常规客户拥有的应用程序注册获得的访问令牌(例如,使用 提供您自己的访问令牌时-AadAccessToken)。

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

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

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

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

为了增加一点混乱,在添加或删除应用程序角色分配时不需要考虑这个问题。两者New-AzureADServiceAppRoleAssignmentRemove-AzureADServiceAppRoleAssignment都可以通过-ObjectId识别分配的服务主体或资源应用程序的服务主体来调用,并且命令将按预期执行。

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

于 2019-12-17T15:31:16.043 回答