通过app-only主体的Sharepoint REST API突然停止工作



我们使用Sharepoint Rest API对内容进行索引。

由于客户的安全要求,我们只能将Sharepoint管理中心授予的API权限与具有机密的app-only主体结合使用。

我们在Azure AD管理中心注册了一个应用程序,并按此处所述授予了它权限。

然后,我们编写了一段Java代码,它调整了此处描述的请求,以检索JWT:

List<NameValuePair> params = new ArrayList<>(10);
params.add(new BasicNameValuePair("grant_type", "client_credentials"));
params.add(new BasicNameValuePair("client_id", clientId + "@" + directoryId));
params.add(new BasicNameValuePair("client_secret", clientSecret));
params.add(new BasicNameValuePair("resource", "00000003-0000-0ff1-ce00-000000000000/" + targetHost + "@" + directoryId));
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost post = new HttpPost("https://accounts.accesscontrol.windows.net/" + directoryId + "/tokens/OAuth/2");
post.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8));
String result;
try (CloseableHttpResponse response = httpClient.execute(post)) {
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
throw new SharepointClient.HttpStatusException(response.getStatusLine().getStatusCode());
result = Strings.fromUtf8(IO.readAll(response.getEntity().getContent()));
}
accessToken = new JsonData(result).get("access_token");
}

然后,我们将该令牌用作API的所有请求的授权头中的承载令牌。

这在几个月内一直很好,直到大约一周前。从那时起,我们只收到403条回复。

HttpResponseProxy{HTTP/1.1 403 Forbidden [Cache-Control: private, max-age=0, Transfer-Encoding: chunked, Content-Type: application/json;odata=verbose;charset=utf-8, Expires: Wed, 30 Sep 2020 09:58:49 GMT, Last-Modified: Thu, 15 Oct 2020 09:58:49 GMT, P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI", X-SharePointHealthScore: 2, X-MSDAVEXT_Error: 917656; Zugriff+verweigert.+Zum+%c3%96ffnen+von+Dateien+an+diesem+Speicherort+m%c3%bcssen+Sie+zun%c3%a4chst+zur+Website+wechseln+und+die+Option+zur+automatischen+Anmeldung+aktivieren., DATASERVICEVERSION: 3.0, X-AspNet-Version: 4.0.30319, SPRequestGuid: f7dd839f-10d1-2000-73fa-40c47dd29bbb, request-id: f7dd839f-10d1-2000-73fa-40c47dd29bbb, MS-CV: n4Pd99EQACBz+kDEfdKbuw.0, Strict-Transport-Security: max-age=31536000, X-FRAME-OPTIONS: SAMEORIGIN, Content-Security-Policy: frame-ancestors 'self' teams.microsoft.com *.teams.microsoft.com *.skype.com *.teams.microsoft.us local.teams.office.com *.powerapps.com *.yammer.com *.officeapps.live.com *.stream.azure-test.net *.microsoftstream.com;, X-Powered-By: ASP.NET, MicrosoftSharePointTeamServices: 16.0.0.20530, X-Content-Type-Options: nosniff, X-MS-InvokeApp: 1; RequireReadOnly, X-MSEdge-Ref: Ref A: 330CB0BA15E647CC8B732FCC45D4F950 Ref B: AM3EDGE0620 Ref C: 2020-10-15T09:58:49Z, Date: Thu, 15 Oct 2020 09:58:49 GMT] ResponseEntityProxy{[Content-Type: application/json;odata=verbose;charset=utf-8,Chunked: true]}}

错误消息是德语的(我不知道为什么,整个系统都设置为英语(。上面写着:";访问被拒绝。要在此位置打开文件,您必须首先访问网站并激活自动登录选项">

有人知道可能发生了什么变化吗?我们需要更改请求中的某些内容吗?

我们已经检查过:

  • 机密未过期
  • 通过证书和Azure AD管理中心权限进行的身份验证仍在工作(相同的API请求,只是使用msal4j进行令牌检索(
  • 通过Postman发送令牌请求和API请求会得到相同的结果

错误的原因不是您缺乏权限。根据错误消息CCD_ 1。

你需要:

1.通过Office 365身份验证。

2.将您的SharePoint Online网站添加到受信任的网站。

3.检查WebClient服务的状态。

请参阅:对连接到SharePoint Online的映射网络驱动器进行疑难解答。

最新更新