Azure私有网络环境下通过托管身份获取Access Token可行吗?请指导步骤
无互联网环境下Azure Function通过托管身份访问Synapse REST API方案
可行。依赖Azure私有链接和Azure AD私有端点,可在虚拟网络内部完成令牌获取与API调用,无需互联网访问。具体步骤如下:
1. 搭建私有网络环境
- 确保Azure Function与Synapse实例处于同一VNet或通过VNet peering连通的网络中
- 为Azure AD令牌服务创建私有端点:资源类型选
Microsoft.AzureActiveDirectory/,资源值填租户ID,端点子类型选token - 为Synapse工作区创建私有端点:资源类型选
Microsoft.Synapse/workspaces,对应目标实例,子类型按需选sql或dev - 禁用所有资源的公共网络访问,仅允许私有端点接入
2. 配置Azure Function网络与应用设置
- 将Function集成到目标VNet,并启用私有端点,限制其仅能通过VNet内部访问
- 添加应用设置:
AZURE_IDENTITY_DISABLE_METADATA_DISCOVERY = true:强制托管身份使用私有端点获取令牌AZURE_AD_ENDPOINT = https://<你的Azure AD私有端点FQDN>:指定私有令牌服务地址
3. 配置托管身份权限
- 在Synapse工作区的IAM界面,为Function的托管身份分配对应权限(如
Synapse Contributor或自定义权限),确保其有权调用目标REST API
4. 调整代码中的DefaultAzureCredential配置
- 初始化凭据时指定私有Azure AD端点并禁用实例发现:
var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { AuthorityHost = new Uri("https://<你的Azure AD私有端点FQDN>"), DisableInstanceDiscovery = true });
- 获取Synapse API令牌时,使用正确的资源范围:
var tokenRequest = new TokenRequestContext(new[] { "https://dev.azuresynapse.net/.default" }); var accessToken = await credential.GetTokenAsync(tokenRequest);
5. 验证连通性与DNS配置
- 确保VNet的DNS能正确解析私有端点的FQDN(推荐使用Azure专用DNS区域)
- 在Function中测试与Azure AD私有端点、Synapse私有端点的连通性,确认无网络阻断
内容的提问来源于stack exchange,提问作者Sampath
相关产品推荐
相关产品推荐

