You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Azure Web应用托管身份通过DefaultAzureCredentials调用Graph API管理B2C?

解决方案:用托管身份无密钥访问Azure AD B2C的Graph API

核心问题原因

你的Web应用托管身份属于主Azure AD租户,而B2C租户是完全独立的身份系统,DefaultAzureCredentials默认会用主AD身份尝试访问B2C的Graph API,但B2C租户中不存在这个身份,因此验证失败。另外,Graph API的权限不是通过Azure IAM分配,而是在B2C租户的应用注册中配置的。

最优无密钥方案(无需手动轮换密钥)

官方推荐的跨租户服务对服务模式,结合托管身份自动管理凭据,步骤如下:

1. 在主Azure AD租户创建「连接器应用」(App A)

  • 进入主AD租户的Azure门户,创建新应用注册,无需设置客户端密码/证书。
  • 记录该应用的Client ID。

2. 在B2C租户中注册App A的服务主体

  • 登录B2C租户的Azure门户,转到「企业应用」→「新建应用程序」→「添加来自库的应用程序」。
  • 搜索App A的名称,添加它作为B2C租户的信任应用。

3. 在B2C租户中给App A分配Graph应用权限

  • 进入B2C租户的「应用注册」,找到刚添加的App A。
  • 转到「API权限」→「添加权限」→「Microsoft Graph」→「应用权限」,勾选Directory.Read.All(或你需要的其他权限)。
  • 点击「授予管理员同意」(必须用B2C租户的全局管理员账号操作)。

4. 在主AD租户中给Web应用托管身份分配访问App A的权限

  • 找到你的Web应用,进入「身份」→「系统分配的身份」,复制托管身份的对象ID。
  • 转到主AD租户中App A的应用注册页面,进入「API权限」→「添加权限」→「我的组织使用的API」,搜索并选择Web应用的托管身份。
  • 添加「应用权限」(若App A未自定义范围,可直接使用Graph的默认范围),并授予主AD租户的管理员同意。

5. 代码中用DefaultAzureCredentials调用Graph API

指定连接器应用的Client ID和B2C租户ID,获取令牌后初始化GraphServiceClient:

var credential = new DefaultAzureCredentials();
// 获取连接器应用的Graph访问令牌
var token = await credential.GetTokenAsync(new TokenRequestContext(
    new[] { "https://graph.microsoft.com/.default" })
    {
        TenantId = "你的B2C租户ID",
        ClientId = "连接器应用App A的Client ID"
    });

// 初始化Graph客户端
var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(requestMessage =>
    {
        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
        return Task.CompletedTask;
    }));

// 调用示例:获取B2C租户用户列表
var users = await graphClient.Users.GetAsync();

为什么这是最优解?

  • 完全无需手动管理客户端密钥,托管身份的凭据由Azure自动轮换,符合安全要求。
  • 利用跨租户应用信任机制,实现主AD托管身份对B2C Graph的合法访问,流程符合Azure官方设计规范。

内容的提问来源于stack exchange,提问作者Pritorian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:14:52