首页 > 解决方案 > .Net 客户端应用程序访问 Azure Data Lake 时出现 AccessControlException

问题描述

我正在尝试使用此示例从 .Net 客户端应用程序访问数据湖

我已经在 AAD 租户中注册了客户端应用程序,并从那里使用了客户端 ID 和客户端密码(因为我认为这是服务到服务身份验证。)

数据湖在不同的订阅中,但属于同一个租户/AAD

该应用程序在数据湖中的特定文件夹(根文件夹下的两个层次结构)的“所有者”和“分配的权限”下具有读/写/执行权限。直到根目录的父文件夹具有此处提到的执行权限。应用程序的“访问控制 (IAM)”中的总体访问级别为“读者”

我收到以下错误,我认为这意味着我能够进行身份验证但没有足够的权限来读取/写入:

Microsoft.Azure.DataLake.Store.AdlsException: Error opening a Read Stream for file something/something/something.txt
Operation: GETFILESTATUS failed with HttpStatus:Forbidden RemoteException: AccessControlException GETFILESTATUS failed with 
error 0x83090aa2 (Forbidden. ACL verification failed. Either the resource does not exist or the user is not authorized to 
perform the requested operation.).
[***][***] JavaClassName: org.apache.hadoop.security.AccessControlException.
Last encountered exception thrown after 1 tries. [Forbidden: AccessControlException]
[ServerRequestId:***]

我不明白缺少哪些其他权限?我必须在这里使用服务主体吗?如果是这样,我如何检查我的应用程序服务主体在此数据湖上的访问权限。谢谢。

标签: azureazure-active-directoryazure-data-lakeazure-authenticationazure-security

解决方案


答案是 - 是的,您必须使用服务主体。

有关应用程序与服务主体的更多信息,请参阅此处

基本上 Azure 在后台使用 Service Principle ID 来授权 Data Lake 中的数据访问。如果您使用应用程序 ID,您将在 Data Lake 文件夹的“访问”刀片上看到与您的应用程序相同的“显示名称”,并错误地认为您具有访问权限。

因此,请确保使用服务主体 ID 而不是应用程序 ID 来授予 ACL 访问权限。


推荐阅读