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

MAUI移动端应用:如何用MSAL令牌调用SharePoint列表数据?

解决MAUI中MSAL登录后调用SharePoint数据的问题

一、先确保获取对应资源的有效令牌

你当前使用的MSAL仓库中,需先调整权限范围(Scopes),确保包含SharePoint或Microsoft Graph的相关权限:

  1. 在MSALClientHelper.cs中,修改Scopes配置,添加目标资源的权限:
    // 如需调用SharePoint REST,添加站点权限
    public static string[] Scopes = { "https://company.sharepoint.com/AllSites.Read" };
    // 如需调用Microsoft Graph,添加Graph权限
    // public static string[] Scopes = { "Sites.Read.All" };
    
  2. 登录后,通过AcquireTokenSilent获取对应资源的令牌(不同资源需要不同令牌,不能混用Graph和SharePoint的令牌):
    var accounts = await _msalClient.GetAccountsAsync();
    var result = await _msalClient.AcquireTokenSilent(Scopes, accounts.FirstOrDefault())
                                  .ExecuteAsync();
    string accessToken = result.AccessToken;
    

二、用HttpClient调用SharePoint REST API

注意你的示例URL遗漏了_api前缀,这是常见失败原因,正确实现如下:

var httpClient = new HttpClient();
// 添加Bearer令牌
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
// 指定返回JSON格式
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json;odata=nometadata"));

// 正确的API路径(需替换占位符)
var apiUrl = "https://company.sharepoint.com/sites/[sitename]/_api/lists/getbytitle('nameoflist')/items";
var response = await httpClient.GetAsync(apiUrl);
// 强制抛出错误,便于排查问题
response.EnsureSuccessStatusCode();
var listData = await response.Content.ReadAsStringAsync();

三、用Microsoft Graph API获取SharePoint数据

如果使用Graph,无需处理SharePoint REST的复杂格式,实现更简洁:

  1. 确保MSAL配置的Scopes包含Sites.Read.All或Sites.ReadWrite.All
  2. 获取Graph令牌后调用接口:
    // 初始化Graph客户端
    var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
    {
        requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
        return Task.CompletedTask;
    }));
    
    // 获取指定站点的列表项(替换站点ID/列表名称)
    var siteId = "sites/[sitename]"; // 也可使用站点的唯一ID格式:"contoso.sharepoint.com,abc123-def456-..."
    var listItems = await graphClient.Sites[siteId].Lists["nameoflist"].Items.Request().GetAsync();
    

四、常见失败排查点

  • 令牌资源不匹配:请求SharePoint REST必须用针对https://company.sharepoint.com的令牌,请求Graph必须用针对https://graph.microsoft.com的令牌,混用会导致401错误
  • 权限未授权:在Azure AD应用注册中,需添加对应API权限并完成管理员同意
  • URL格式错误:SharePoint REST必须包含_api前缀,列表名称需匹配大小写
  • 请求头缺失:必须指定Accept头为JSON格式,否则SharePoint可能返回XML或错误响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:18:11