使用 c# 从 SharePoint Online 外部获取 SharePoint 列表数据

Get SharePoint list data from outside SharePoint Online using c#

我有一个 SharePoint 在线列表,需要从 SharePoint 外部的列表中获取数据。 我需要使用访问令牌方法,因为我已经在同一个租户的 azure AD 中创建了一个应用程序并试图获取列表但它给出了未经授权的错误。

我尝试使用 SharePoint REST api 并在 headers 中传递令牌。我已经参考了以下 URL: https://www.ktskumar.com/2017/01/access-sharepoint-online-using-postman/ 但它在 Postman 本身给我的错误是“{"error_description":"Invalid JWT token. The token is expired."}”。 我在应用程序注册和清单中添加了 api 权限,但仍然没有成功!

我已经测试了您提供的 link 中的步骤。它对我来说很好用。

此错误是由于您在 https://.sharepoint.com/_layouts/15/appinv.aspx.

注册的应用的客户端密码过期所致

您可以注册一个新应用或replace an expiring client secret in a SharePoint Add-in

你在azure和SharePoint add-in中注册的app不一样,token也不一样

您可以使用加载项身份验证来访问 SharePoint。

Demo thread here

如果您确实想使用 azure 应用访问 SharePoint,您可以检查 this thread

我已经解决了这个问题,首先创建一个访问令牌,然后通过传递令牌进行http请求。

using (var context = new ClientContext("SiteURL"))
                {                   
                    context.ExecutingWebRequest += Context_ExecutingWebRequest;
}

public void Context_ExecutingWebRequest(object sender, WebRequestEventArgs e)
        {
            e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + GetAccessToken();
        }
 public string GetAccessToken()
        {
            try
            {
                #region Get Access token for Azure AD access              
                var client = new RestClient("https://accounts.accesscontrol.windows.net/" + TenantID + "/tokens/OAuth/2");
                var request = new RestRequest(Method.POST);                
                request.AddParameter("grant_type", "client_credentials");
                request.AddParameter("client_id", "ClientID@TenantID");
                request.AddParameter("client_secret", "ClientSecret");
                request.AddParameter("resource", "00000003-0000-0ff1-ce00-000000000000/SharePointSite@TenantID");
                IRestResponse restClientResponse = client.Execute(request);
                var DeserializeObject = JsonConvert.DeserializeObject<BearerToken>(restClientResponse.Content.ToString());
                string accessToken = DeserializeObject.AccessToken;
                #endregion           

                return accessToken;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }