Azure跨租户函数调用:非公开端点下同步获取结果的实现方法
跨Azure租户调用私有函数的实现方案
核心思路
对应AWS中通过lambda:InvokeFunction IAM角色实现跨账号调用的逻辑,Azure里可以通过Azure AD身份验证+托管标识的组合,让租户A的Function1以身份认证的方式调用租户B中未公开的Function2,同步获取返回结果。
具体步骤
1. 给租户A的Function1配置托管标识
- 进入Function1的Azure门户页面,打开身份选项卡,启用系统分配托管标识(或按需选择用户分配标识)。
- 记录该标识的客户端ID或对象ID,后续授权环节会用到。
2. 在租户B中给Function2配置权限和身份验证
- 进入Function2的门户页面,打开身份验证选项卡,启用Azure Active Directory作为身份提供程序(可选择快速启动完成基础配置)。
- 到Function2的访问控制(IAM)页面,添加权限:将租户A的Function1托管标识添加为函数应用调用者角色(遵循最小权限原则,不建议用权限更高的角色)。
注意:跨租户授权需要先在租户B的Azure AD中注册租户A的标识作为外部身份,可通过“企业应用”搜索租户A的标识名称完成添加。
3. Function1中编写调用代码
使用Azure官方SDK获取身份令牌,再调用Function2的内部端点。以下是C#示例代码:
using Azure.Identity; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; public static async Task<string> Run(HttpRequest req, ILogger log) { // Function2的内部端点URL,格式为https://<函数应用名>.azurewebsites.net/api/<触发器名称> var function2Endpoint = "https://your-function2-app.azurewebsites.net/api/YourFunction2Trigger"; // 获取访问令牌,目标资源为Function2的应用ID URI(可在Function2的身份验证页面找到) var credential = new DefaultAzureCredential(); var token = await credential.GetTokenAsync(new Azure.Core.TokenRequestContext( new[] { "https://your-function2-app-id-uri/.default" })); // 发起授权请求 using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Token); // 根据Function2的触发方式调整请求方法和内容(示例为POST) var response = await httpClient.PostAsync(function2Endpoint, null); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); }
4. 验证效果
- 测试Function1的调用,确认能正常获取Function2的返回结果。
- 直接访问Function2的端点URL,会返回未授权错误,证明端点未公开。
关键注意事项
- 跨租户信任:必须确保租户B的Azure AD信任租户A的托管标识,可通过Azure AD B2B协作或外部身份注册完成。
- 令牌缓存:生产环境建议缓存访问令牌,减少Azure AD的请求次数,提升调用性能。
- 权限控制:严格遵循最小权限原则,只给Function1的标识分配调用Function2所需的最低权限。
内容的提问来源于stack exchange,提问作者Motoko
相关产品推荐
相关产品推荐

