我正在编写一个应用程序,该应用程序使用 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:...AuthorizationAzureTokenHelper.cs:30
...Authorization.AuthorizationManager.GetClientContextFromAzureCode(String code, String site) in d:..AuthorizationAuthorizationManager.cs:57
...Pages.Install.btnInstall_Click(Object sender, EventArgs e) in d:..PagesInstall.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 中检查了应用程序权限,它有权在所有网站集上写入。我的配置有问题还是应该尝试其他方法?
我们在这里遇到了同样的问题。在我们的 C# 应用中,我们使用HttpClient
来点击 SharePoint REST API 以从列表中读取项目。在开发过程中,我们在"工作组网站"下设置了一个列表。我们用来访问 API 的 URL 看起来有点像这样:
https://mycompany.sharepoint.com/_api/web/lists/getbytitle('MyList')/items
在 App.config 中,我们设置了一个ServiceResourceId
参数。这被用作调用 Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext
的 AcquireToken()
方法时的resource
参数。重要的是,我们还将其用作 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/"/>