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

如何让Azure AD B2C用户通过Graph API访问M365环境?

解决方案:Azure AD B2C用户访问主Azure AD租户的M365环境

首先明确官方限制:Azure AD B2C没有开箱即用的方式让用户关联到创建它的主Azure AD租户的M365环境,且官方明确B2C无法用于Microsoft 365身份验证。针对你需要通过Graph API操作M365的业务需求,结合已完成的基础(B2C用户可登录、主AD用户可通过Graph访问M365),推荐采用无用户访问的应用权限方案,具体步骤如下:

核心调整:在主Azure AD租户创建应用注册

你之前在B2C租户的应用注册中添加权限的操作无效,因为M365资源归属主Azure AD租户,权限必须在主租户内申请:

  • 登录主Azure AD租户的Azure门户,创建新的应用注册。
  • 为该应用添加Sites.ReadWrite.All应用权限(注意是应用权限,而非委派权限),并由主租户管理员授予管理员同意。

使用客户端凭据流调用Graph API

这种方式下,Web应用以自身身份访问M365资源,与B2C用户的身份分离,适合外部承包商提交文档的场景:

  1. 保存主租户应用注册的客户端ID、客户端密钥/证书,以及主租户的ID。
  2. 在msal-node中使用acquireTokenByClientCredential()方法获取访问令牌,而非针对用户的getAuthCodeURL()。示例代码如下:
const { ConfidentialClientApplication } = require('@azure/msal-node');

const config = {
    auth: {
        clientId: '主租户应用的客户端ID',
        authority: 'https://login.microsoftonline.com/{主租户ID}', // 指向主AD租户,而非B2C租户
        clientSecret: '主租户应用的客户端密钥'
    }
};

const cca = new ConfidentialClientApplication(config);

const tokenRequest = {
    scopes: ['https://graph.microsoft.com/.default'] // 应用权限需使用.default scope
};

async function getAccessToken() {
    const response = await cca.acquireTokenByClientCredential(tokenRequest);
    return response.accessToken;
}

// 获取令牌后调用Graph API操作M365文档库
async function uploadDocumentToLibrary(token, fileContent) {
    // 调用Graph API的PUT请求上传文件到指定文档库
    const response = await fetch('https://graph.microsoft.com/v1.0/sites/{site-id}/drive/items/root:/{folder-path}/{file-name}:/content', {
        method: 'PUT',
        headers: {
            'Authorization': `Bearer ${token}`,
            'Content-Type': 'application/octet-stream'
        },
        body: fileContent
    });
    return response.json();
}

业务流程整合

当B2C用户登录你的Web应用后:

  1. 验证用户的B2C身份(已完成)。
  2. 调用上述getAccessToken()获取主租户Graph API的令牌。
  3. 使用令牌调用Graph API完成M365文档库的操作(如上传合规文档)。

关键注意事项

  • 不要混用B2C租户和主AD租户的权限配置:所有针对M365的权限必须在主AD租户的应用注册中申请。
  • 客户端凭据流的权限范围固定为https://graph.microsoft.com/.default,会包含所有已授予的应用权限。
  • 确保主租户应用的权限最小化:如果仅需要上传文档,Sites.ReadWrite.All足够,避免授予更宽泛的权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:56:19