从客户端应用程序访问 Sharepoint Online

Access to Sharepoint Online from Client App

最近我遇到了一个问题,我有一个需要连接到 SharePoint Online 的 .NET Web API。在 Azure AD 中,我已向 AppId“AllSites.Manage.All”、AllSites.Read.All 等提供所有权限。我使用 CSOM 库将令牌传递到共享点。但是一旦我尝试对收到的 clientcontext 执行查询,它就会抛出 401 UnAuthorized 错误

     private async Task<ClientContext> GetClientContextWithAccessToken1(string targetUrl)
    {
        var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] {"Files.ReadWrite.All", "Sites.Manage.All", "AllSites.Read"});
        HttpClient httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        var response = await httpClient.GetAsync($"https://graph.microsoft.com/beta/me");
        if(response.StatusCode == HttpStatusCode.OK)
        {
            var content = await response.Content.ReadAsStringAsync();
        }
        using(ClientContext clientContext = new ClientContext(targetUrl))
        {
            clientContext.ExecutingWebRequest +=
                delegate (object oSender, WebRequestEventArgs webRequestEventArgs)
                {
                    webRequestEventArgs.WebRequestExecutor.RequestHeaders["Authorization"] =
                        "Bearer " + accessToken;
                };
            return clientContext;
        }
    }

对于查询 https://graph.microsoft.com/beta/me 的请求,需要以下权限之一才能获得管理员的同意。像 Directory.Read.All , User.Read.All ...

此外,请确保在您注册的 AAD 应用程序中添加 Sites.Read.AllSites.ReadWrite.All 应用程序权限,并在获得访问共享点网站的令牌之前获得管理员同意。

如果您使用的是 v2 端点,请在您的互联网浏览器中转至下方 URL 以进行管理员授权:

https://login.microsoftonline.com/{yourtenant}/adminconsent?client_id={ applicationid /clientId }&state=123&redirect_uri={redirect uri of your app}

并使用全局管理员帐户登录并接受此权限。

参考: azure-app-cannot-access-sharepoint-online-sites

如果您正在调用 Microsoft Graph API 端点,您应该避免使用 csom。

AllSites.Manage.AllAllSites.Read.All 等权限与 SharePoint 和 CSOM 相关,它们不适用于 Graph API 端点。

对于 Graph API 你需要根据你的情况获得不同的 token or better option is to use Microsoft Graph Client Library for .NET