我正在尝试使用this example
从.Net客户端应用程序访问Data Lake。我已经在AAD租户中注册了客户端应用,并从那里使用了客户端ID和客户端密码(我认为这是服务到服务的身份验证。)
Data Lake处于不同的订阅中,但属于同一租户/ AAD
该应用在“所有者”和“分配的权限”下具有读取/写入/执行权限 用于数据湖中的特定文件夹(根文件夹下两个层次)。直到根目录的父文件夹都具有mentioned here的执行权限。该应用程序在“访问控制(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:***]
我不明白缺少哪些其他权限? 我必须在这里使用服务主体吗?如果是这样,我如何检查该数据湖上我的应用程序的服务主体需要什么? 谢谢。
答案 0 :(得分:0)
最简单的测试方法,向您的应用所有者授予对数据湖的访问权限(Access Control IAM),等待15分钟并进行测试。如果可以解决>> >>这意味着您在某个地方弄乱了权限。
无法告诉您权限分配中的错误。通常,您需要执行read \ execute才能读取文件(这有点令人惊讶)。
答案 1 :(得分:0)
答案是-是的,您必须使用服务主体。
Please see here for more information about Applications vs Service Principals
基本上,Azure在后台使用服务主体ID来授权Data Lake中的数据访问。如果使用应用程序ID,则会在Data Lake Folder的“访问”刀片上看到与您的应用程序相同的“显示名称”,并错误地认为您具有访问权限。
因此,请确保使用服务主体ID而非应用程序ID来授予ACL访问权限。