问题描述
我在使用 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
然后在 https://TenantName-admin.sharepoint.com/_layouts/15/appinv.aspx 中使用此 xml 设置加载项权限:
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
</AppPermissionRequests>
然后使用 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