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

使用Microsoft Graph .NET SDK的OBO流调用站点/文件接口返回403权限拒绝

OBO流调用Microsoft Graph API获取站点列表时403权限拒绝问题

问题描述

需通过代表用户(OBO)流实现SharePoint/OneDrive的文件列表、下载、上传操作,目标是访问任意站点/驱动器文件并执行对应操作。采用Next.js+next-auth架构,已在Azure AD注册前端应用NextAuth和Web API应用NextAuthAPI,但调用m_GraphClient.Sites.GetAllSites.GetAsync()时返回403 "Access denied",而m_GraphClient.Me.GetAsync()可正常执行。

现有代码

前端NextAuth Azure AD提供者配置

providers: [
    AzureADProvider({
      clientId: process.env.AZURE_AD_CLIENT_ID, // AAD中NextAuth的客户端ID
      clientSecret: process.env.AZURE_AD_CLIENT_SECRET, // AAD中NextAuth的客户端密钥
      tenantId: process.env.AZURE_AD_TENANT_ID, 
      authorization: {
        params: {
          scope: "openid email profile offline_access api://NextAuthAPI/.default",
          prompt: "consent",
        }
      },
    }),
  ]

后端.NET Graph客户端初始化

var scopes = new[] { "https://graph.microsoft.com/.default" };

var tenantId = "c0dc-------------------5ce7";
var clientId = "087e66-----------------------b5";
var clientSecret = "p5Q8Q-----------------------JddpK";

var options = new OnBehalfOfCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

var oboToken = /* 传入Next.js前端获取的访问令牌 */;

var onBehalfOfCredential = new OnBehalfOfCredential(tenantId, clientId, clientSecret, oboToken, options);

m_GraphClient = new GraphServiceClient(onBehalfOfCredential, scopes);

环境版本

  • 后端:Microsoft.Graph 5.11.0、Azure.Identity 1.9.0
  • 前端:Next.JS 13.4.5-canary.2、next-auth 4.22.1

解决方案

1. 检查Azure AD权限配置

(1)Web API应用(NextAuthAPI)的Graph权限

OBO流属于委托权限场景,需为NextAuthAPI添加以下委托权限并完成管理员同意:

  • Sites.ReadWrite.All:允许访问所有站点内容(满足列表、上传、下载需求)
  • Files.ReadWrite.All:允许访问所有OneDrive驱动器内容

操作步骤:

  • 登录Azure门户 → 应用注册 → 找到NextAuthAPI → API权限 → 添加权限 → Microsoft Graph → 委托权限
  • 搜索并勾选上述权限 → 添加权限 → 点击“授予管理员同意”

(2)前端应用(NextAuth)的权限

确保NextAuth应用已添加对NextAuthAPI的自定义范围access_as_user,且已完成同意(前端配置中的prompt: "consent"会触发用户同意,若为组织内应用建议完成管理员同意)。

2. 验证OBO生成的Graph令牌

解析后端通过OBO流程获取的Graph访问令牌,检查scp声明是否包含Sites.ReadWrite.All和Files.ReadWrite.All:

  • 若没有对应权限,说明权限配置未生效,重新检查管理员同意是否完成
  • 若权限存在但仍报错,需检查用户本身对目标SharePoint站点的访问权限(OBO流代表用户操作,用户需具备站点访问权限;若要访问任意站点,用户需为全局/SharePoint管理员)

3. 调整Graph客户端的权限范围

推荐直接指定所需的具体权限范围,替代.default(明确指定权限更清晰,避免不必要的权限返回):

var scopes = new[] { 
    "https://graph.microsoft.com/Sites.ReadWrite.All", 
    "https://graph.microsoft.com/Files.ReadWrite.All" 
};

4. 确认OBO流的权限传递逻辑

前端获取的是针对NextAuthAPI的令牌,后端通过OBO流程将该令牌交换为针对Graph API的令牌,此过程依赖NextAuthAPI已被授予的Graph委托权限,无需在前端scope中添加Graph权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:04:58