Azure跨租户专用端点创建失败:LinkedAuthorizationFailed问题解决
环境与上下文
- 租户A:托管运行Go程序的虚拟机
- 租户B:拥有已启用防火墙、完全禁用公共访问的存储账户
已完成的手动操作
已在租户A中手动创建指向租户B存储账户资源ID的专用端点,并配置了对应专用DNS区域,租户A虚拟机上的Go程序已能通过该专用端点访问租户B存储账户中的Blob。
自动化目标
使用Azure Function App实现上述专用端点创建流程的自动化。
当前设计
- 在租户A注册多租户Entra(AAD)应用,并已投影到租户B
- 租户A中的Function App:
- 包含HTTP触发器,接收指定待链接存储账户的请求负载
- 将负载加入队列
- 队列触发器读取负载,使用Entra应用的
ClientSecretCredential尝试在租户A中创建引用租户B存储账户的专用端点
已配置权限
多租户应用注册权限
- Microsoft Graph:
Application.Read.All、AppRoleAssignment.ReadWrite - Azure Service Management:
user_impersonation
租户B侧权限分配
在租户B的目标订阅上,已为该应用注册授予:
Storage Account ContributorPrivate Endpoint Contributor
错误信息
Function App尝试创建专用端点时触发以下错误:
(LinkedAuthorizationFailed) 客户端有权对范围'/subscriptions/87332a70-7c1b-4437-aa3b-ec7c00d72de0/resourceGroups/ash-private-link-rg/providers/Microsoft.Network/privateEndpoints/testPe'执行操作'Microsoft.Storage/storageAccounts/PrivateEndpointConnectionsApproval/action',但当前租户'68b76eeb-dd53-4531-9550-3e6702ad1a1f'无权访问链接订阅'7cc25562-a9a4-42a5-813c-56b5b7a9f3dc'。
核心疑问
如何确保租户A中的多租户应用在专用端点审批流程中有权访问租户B的链接订阅?需要哪些跨租户配置来授予该授权?
要解决跨租户专用端点创建的授权问题,需完成以下关键配置:
1. 确认多租户应用在租户B中生成服务主体
多租户应用投影到租户B后,需确保已在租户B中生成对应的服务主体:
- 在租户B的Entra ID控制台进入「企业应用」,搜索该多租户应用名称,确认其存在
- 若未自动生成,可由租户B管理员手动同意应用权限,或通过PowerShell命令创建:
New-AzADServicePrincipal -ApplicationId <多租户应用的ClientID>
2. 为租户B订阅配置跨租户访问权限
在租户B的Azure门户中,为目标订阅添加角色分配:
- 进入租户B的目标订阅,选择「访问控制(IAM)」
- 添加角色分配,将
Reader角色授予租户B中该多租户应用的服务主体 - 确认该应用已拥有
Microsoft.Storage/storageAccounts/privateEndpointConnections/write权限(Storage Account Contributor角色已包含此权限,用于专用端点连接审批)
3. 在Function App中切换租户上下文操作
创建跨租户专用端点时,需分两步切换上下文:
- 先使用租户B的Tenant ID初始化
ClientSecretCredential,获取租户B的访问令牌 - 调用租户B的Azure资源管理器API,预批准存储账户的专用端点连接请求
- 再切换回租户A的上下文,创建专用端点资源指向已预批准的连接
4. 配置租户B的跨租户访问策略
在租户B的Entra ID控制台进入「跨租户访问设置」:
- 将租户A添加到「允许的外部租户」列表
- 针对应用访问设置为「允许访问」,并将该多租户应用纳入允许范围
补充必要权限
确保租户B中该应用服务主体拥有:
Microsoft.Resources/subscriptions/read权限(用于读取租户B订阅信息)Microsoft.Network/privateEndpoints/read权限(可选,用于排查资源状态)
内容的提问来源于stack exchange,提问作者Ashwin

