1

我正在编写一个使用 Windows Azure AD 对 SharePoint Online 进行身份验证的应用程序。我正在尝试将应用程序中的一些文件预配到 SharePoint 租户上的现有网站集。这适用于位于 [subdomain].sharepoint.com 上的默认网站集,但是当我尝试在非默认网站集(即 [subdomain].sharepoint.com/mysite )上配置文件时,代码会引发此异常:

[WebException: The remote server returned an error: (400) Bad Request.]
   System.Net.HttpWebRequest.GetResponse() +6540964
   Microsoft.IdentityModel.Clients.ActiveDirectory.<GetResponseSyncOrAsync>d__2.MoveNext() +382
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.IdentityModel.Clients.ActiveDirectory.<SendPostRequestAndDeserializeJsonResponseAsync>d__0`1.MoveNext() +414

[AdalServiceException: AADSTS50001: Resource 'https://[subdomain].sharepoint.com/sites/mysite' is not registered for the account.
Trace ID: f9d32123-4a42-4890-bf5d-7e979083ed18
Correlation ID: 71a6d021-270d-4974-8bd6-b17fb06aab9d
Timestamp: 2014-12-19 11:21:30Z]
   Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.RunAsyncTask(Task`1 task) +89
   Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.AcquireTokenByRefreshToken(String refreshToken, ClientCredential clientCredential, String resource) +59
   ...Authorization.Azure.TokenHelper.GetContext(String refreshToken, String site) in d:\...\Authorization\Azure\TokenHelper.cs:30
   ...Authorization.AuthorizationManager.GetClientContextFromAzureCode(String code, String site) in d:\..\Authorization\AuthorizationManager.cs:57
   ...Pages.Install.btnInstall_Click(Object sender, EventArgs e) in d:\..\Pages\Install.aspx.cs:65
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628114
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

我检查了 AD 中的应用程序权限,它有权在所有网站集上写入。我的配置有问题还是应该尝试不同的方法?

4

1 回答 1

0

我们在这里遇到了同样的问题。在我们的 C# 应用程序中,我们使用HttpClientSharePoint REST API 从列表中读取项目。在开发过程中,我们在 Team Site 下设置了一个列表。我们用来访问 API 的 URL 看起来有点像这样:

https://mycompany.sharepoint.com/_api/web/lists/getbytitle('MyList')/items

在 App.config 中我们设置了一个ServiceResourceId参数。resource这在调用 的AcquireToken()方法时用作参数Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext。重要的是,我们还将它用作 API 调用的基本 URL。

当我们尝试转移到生产场景时,有问题的列表位于自定义站点中,而不是团队站点。我们可以登录到浏览器并像这样点击 URL 并查看返回的结果:

https://mycompanylive.sharepoint.com/MySiteName/_api/web/lists/getbytitle('MyList')/items

我们已将其更改为ServiceResourceId不再https://mycompanylive.sharepoint.com/MySiteName/允许我们登录并抛出您提到的异常。修复方法是在身份验证时使用一个带有基本服务 URL 的配置参数,然后在调用 API 时将另一个参数用作基本 URL。在我提到的示例中,它看起来像这样:

<!-- Pass this to AcquireToken() during authentication. This should be the root of your SharePoint instance. -->
<add key="ServiceResourceLoginId" value="https://mycompanylive.sharepoint.com/"/>
<!-- The base URI when using HttpClient to call the API.  -->
<add key="APIBaseURI" value="https://mycompanylive.sharepoint.com/MySiteName/"/>
于 2015-08-17T11:13:47.163 回答