客户端的对象标识符没有权限执行在范围上执行“Microsoft.DataFactory/datafactories/datapipelines/read”操作。

72
我正在尝试从Azure函数以编程方式调用数据工厂管道。它会抛出以下错误。
链接: http://eatcodelive.com/2016/02/24/starting-an-azure-data-factory-pipeline-from-c-net/ AuthorizationFailed:客户端“XXXX-XXXXX-XXXX”(对象ID为“XXX829e05'XXXX-XXXXX”)没有授权执行操作“Microsoft.DataFactory/datafactories/datapipelines/read”,范围为“/subscriptions/XXXXXX-4bf5-84c6-3a352XXXXXX/resourcegroups/fffsrg/providers/Microsoft.DataFactory/datafactories/ADFTestFFFS/datapipelines/ADFTutorialPipelineCustom”。
尝试搜索类似的问题,但没有任何搜索结果给我解决方案,您能指导我们可能出了什么问题吗?
目标是在将文件添加到blob时运行数据工厂管道。因此,为了实现结果,我们正在尝试使用blob触发器从Azure函数调用数据工厂管道。
11个回答

100

步骤1:登录到您的Azure门户。
步骤2:在左侧菜单栏中查找“订阅”并单击。
输入图像描述

步骤3:单击访问控制IAM,然后单击添加。输入图像描述

步骤4:在“添加权限”窗口中,选择贡献者角色。在输入框中,输入您在Azure AD中创建的应用程序名称,并选择它。在我的情况下,我创建了Azure资源管理器。输入图像描述

步骤5:成功授权后,在订阅窗口中单击“刷新”,您将看到应用程序显示在列表中。请参见下面的示例。 输入图像描述


3
应该将其接受为正确答案。 - Ben
5
对我来说,“Azure Resource Management”不是可从列表中选择的有效选项。 - rollsch
6
你需要阅读作者写的内容:“在选择输入框中,输入你在Azure AD(Azure Active Directory中创建的应用程序名称,并选择它。在我的情况下,我创建了Azure资源管理器。”如果你创建了“MyApp”,你必须在“选择”字段中输入“MyApp”。 - kayo
2
在苦苦挣扎了两天之后,我找到了最好和准确的答案。即使微软也没有提到这些黑科技/依赖关系来解决这些问题。感谢Shebin。 - Arvindvp6
5
这仍然是一个非常好的解决方案。请给这个人一块饼干!微软从未提到过需要这样做! - FAB
显示剩余6条评论

11

使用Azure资源组和RBAC时常见问题https://blogs.msdn.microsoft.com/azure4fun/2016/10/20/common-problem-when-using-azure-resource-groups-rbac/

这个问题更有可能发生在较新的订阅中,通常是因为某种资源类型在该订阅中从未创建过。

订阅管理员通常通过在订阅级别上授予资源组所有者贡献者权限来解决此问题,这与他们将访问隔离到资源组级别而非订阅级别的策略相矛盾。

根本原因

一些管理员说,某些资源需要访问订阅级别才能创建这些资源,并且资源组级别的“所有者”权限是不足的。这是不正确的。

让我们退后一步,先了解一下这一切是如何工作的。

要使用Azure(使用资源管理器模型)提供任何资源,您需要具有支持创建该资源的资源提供程序。例如,如果您要提供虚拟机,则需要在订阅中首先有一个“Microsoft.Compute”资源提供程序。

资源提供程序仅在订阅级别上注册。

幸运的是,Azure资源管理器(ARM)足够智能,可以为您找出解决方法。当新的Azure资源被提供时,如果该资源类型所需的资源提供程序尚未在订阅中注册,ARM将尝试为您注册它。该操作(资源提供程序注册)需要访问订阅级别。

默认情况下,任何新的Azure订阅都会预先注册一些常用的资源提供程序。例如,IoTHub的资源提供程序不在其中。
当用户仅被授予特定资源组的所有者权限时,如果该用户尝试创建需要首次注册资源提供程序的资源,则此操作将失败。我们在上面的案例中尝试创建IoThub时就出现了这种情况。
因此,重点是,我们不需要为了让用户能够在他们拥有所有者权限的资源组中创建诸如HDInsight、IotHub和SQLDW等资源而向订阅级别授予访问权限,只要这些资源的资源提供程序已经注册即可。

8
你会收到错误提示:“你没有在数据工厂上执行操作 'Microsoft.DataFactory/datafactories/datapipelines/read' 的授权,因为你没有在数据工厂上具有相关权限。”
要么拥有“Contributor” / “DataFactoryContributor”权限以创建和管理数据工厂资源或子资源。Azure RBAC角色的更多详细信息请参阅以下链接:

https://learn.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles

由于客户正在尝试从Azure Function内部使用ADF客户端,建议使用AAD应用程序和服务主体对ADF客户端进行身份验证。您可以在此处找到创建AAD应用程序和服务主体的说明:

https://learn.microsoft.com/en-us/azure/azure-resource-manager/resource-group-authenticate-service-principal

请按照以下链接中的说明创建Active Directory应用程序、服务主体,然后分配到Data Factory Contributor角色,并使用ADF客户端的服务主体代码示例。请保留HTML标签。

7
我们最近遇到了相同的消息问题,并发现是由于用户使用不同的订阅登录导致的(我们有2个订阅)。对于我们,使用“az login --subscription”解决了这个问题。

1
由于默认订阅与我们想要使用的订阅不同,我们遇到了相同的问题。AAD应用程序的生成已经完成,但是它会出现身份验证错误。甚至不知道是否可能在UI中看到它被分配到错误的订阅... - emp

7

0
解决方案:
  1. 步骤1:在Azure Active Directory中注册一个应用程序。
  2. 步骤2:将“数据工厂参与者”角色分配给同一应用程序。我们可以使用PowerShell实现此目的。

以下代码适用于我。请在使用Azure凭据登录后尝试在PowerShell中运行。
实施:

  1. 步骤1:$azureAdApplication = New-AzureRmADApplication -DisplayName <AppName> -HomePage <URL> -IdentifierUris <URL with domain> -Password <Password>
  2. 步骤2:New-AzureRmRoleAssignment -RoleDefinitionName "Data Factory Contributor" -ServicePrincipalName $azureAdApplication.ApplicationId

0

0
我尝试通过在订阅级别和资源等级别上添加角色(如上所述的贡献者、ADF贡献者和读者)来解决问题。 但是,当我尝试对我的应用程序进行身份验证时,我一直遇到错误, 所以我通过将我的应用程序添加到订阅级别,并给予它读者权限来解决了这个问题。

0

0
我遇到了类似的问题。我可以访问不同的租户,但默认选择的租户是错误的。通过使用以下方式登录az来解决了这个问题:
az login --tenant <tenantID> 

之后,我成功地运行了az ad sp create-for-rbac命令。

1
感谢您对贡献至Stack Overflow社区的兴趣。这个问题已经有相当多的答案,包括一个已经得到社区广泛验证的答案。您确定您的方法之前没有被提到过吗?如果是这样,说明一下您的方法有何不同,以及在什么情况下可能更可取,或者为什么您认为之前的答案不够满意。您可以友善地[编辑]您的答案来给出解释吗? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接