.Net 客户端应用程序访问 Azure Data Lake 时出现 AccessControlException

AccessControlException when .Net Client App accessing Azure Data Lake

我正在尝试使用 this example

从 .Net 客户端应用程序访问数据湖

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

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

该应用在 'Owner' 和 'Assigned Permissions' 下具有 Read/Write/Execute 权限 对于数据湖中的特定文件夹(根文件夹下的两个层次结构)。根目录之前的父文件夹具有 mentioned here 的执行权限。该应用在 'Access Control (IAM)' 中的总体访问级别为 'Reader'

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

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:***]

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

最简单的测试方法,授予您的应用程序所有者对数据湖的权限(访问控制 IAM),等待 15 分钟并进行测试。如果这样可以解决问题 >> 这意味着您在某处弄乱了权限。

无法判断您在权限分配中哪里出错了。作为一般规则,您需要 read\execute 才能读取文件(这有点令人惊讶)。

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

Please see here for more information about Applications vs Service Principals

基本上,Azure 在后台使用服务主体 ID 来授权 Data Lake 中的数据访问。如果您使用应用程序 ID,您将在 Data Lake 文件夹的 'Access' blade 上看到与您的应用程序相同的 'Display Name',并错误地认为您具有访问权限。

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