azure - .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:***]
我不明白缺少哪些其他权限?我必须在这里使用服务主体吗?如果是这样,我如何检查我的应用程序服务主体在此数据湖上的访问权限。谢谢。
解决方案
答案是 - 是的,您必须使用服务主体。
基本上 Azure 在后台使用 Service Principle ID 来授权 Data Lake 中的数据访问。如果您使用应用程序 ID,您将在 Data Lake 文件夹的“访问”刀片上看到与您的应用程序相同的“显示名称”,并错误地认为您具有访问权限。
因此,请确保使用服务主体 ID 而不是应用程序 ID 来授予 ACL 访问权限。
推荐阅读
- python - 如何更改 ttk.OptionMenu 的字体?
- amazon-web-services - 如何向 API 请求添加 Cognito 授权?以便 Lambdas 可以访问它
- java - 如何仅从数组中的父节点获取文本
- python-3.x - AttributeError:“NoneType”对象没有属性“isnull”
- php - 如何解决临时站点上的“致命错误:内存不足”问题?
- opencover - 我需要什么来编译和调试 OpenCover 解决方案?
- tumblr - Tumblr 的 {block:HomePage} 是做什么的?
- javascript - 将输入类型数值从 Double 解析为 Integer
- database - 写入 MongoDB 的多个副本
- sql - 如何在 SQL Server 中获取从今天开始的前 7 天数据