在线共享点的 CSOM 问题

问题描述

我在使用 CSOM 时遇到了一些问题。

我正在尝试获取 Sharepoint 站点标题,但不幸的是我收到此错误 => 远程服务器返回错误:(401) 未经授权

using (var context = GetClientContext("https://tenant.sharepoint.com/"))
 {
    context.Load(context.Web,p => p.Title);
    await context.ExecuteQueryAsync();
    Console.WriteLine($"Title: {context.Web.Title}");
  }

  public ClientContext GetClientContext(string targetUrl)
    {
       ClientContext clientContext = new ClientContext(targetUrl);
       clientContext.ExecutingWebRequest +=
        delegate (object oSender,WebRequestEventArgs webRequestEventArgs)
        {
           string token = GetToken();
            webRequestEventArgs.WebRequestExecutor.RequestHeaders["Authorization"] =
                "Bearer " + token;
        };
         return clientContext   }



 public string GetToken()
        {
            IConfidentialClientApplication app;
            var instance = "https://login.microsoftonline.com/{0}";
            var tenant = "tenantId";
            var authority = String.Format(CultureInfo.InvariantCulture,instance,tenant);
            string[] scopes = new string[] { "https://tenant.sharepoint.com/.default" };

            app = ConfidentialClientApplicationBuilder
                .Create("clientId")
                .WithClientSecret("secretId")
                .WithAuthority(new Uri(authority))
                .Build();

            AuthenticationResult result = app.AcquiretokenForClient(scopes)
                .ExecuteAsync().GetAwaiter().GetResult();
            return result.Accesstoken;
        }

这是appRegistration的权限 App Registration

但我可以从图形调用中得到它

解决方法

如果要在 SharePoint Online CSOM 中使用 App Only 权限,请使用此 URL 注册 SharePoint 加载项而不是 Azure AD:

https://tenant.sharepoint.com/_layouts/15/appregnew.aspx

enter image description here

然后在 https://TenantName-admin.sharepoint.com/_layouts/15/appinv.aspx 中使用此 xml 设置加载项权限:

<AppPermissionRequests AllowAppOnlyPolicy="true">    
    <AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />    
</AppPermissionRequests>

enter image description here

然后使用 Nuget 安装 SharePointPnPCoreOnline 包并像这样调用:

using OfficeDevPnP.Core;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Client;

string siteUrl = "https://tenant.sharepoint.com/sites/demo";  
using (var cc = new AuthenticationManager().GetAppOnlyAuthenticatedContext(siteUrl,"[Your Client ID]","[Your Client Secret]"))  
{  
    cc.Load(cc.Web,p => p.Title);  
    cc.ExecuteQuery();  
    Console.WriteLine(cc.Web.Title);  
};  

这是一个完整的演示供您参考:

Connect To SharePoint Online Site With App Only Authentication