如何使用ADAL JS到SharePoint Online进行身份验证

时间:2019-05-21 23:56:54

标签: sharepoint-online adal adal.js

我正在跟踪位于https://nickvandenheuvel.eu/tag/adal-js/的示例代码,但是我的代码由于SharePoint连接失败而出现ADAL错误AADSTS500011。

错误消息指出“资源主体名为 在名为的租户中找不到https://my.sharepoint.com/sites/mysite mytenant.onmicrosoft.com。如果租户的管理员未安装该应用程序,或者该租户中的任何用户未同意该应用程序,则可能会发生这种情况。您可能已将身份验证请求发送给错误的租户。”

我的代码与文章完全相同。我的想法可能是我的SharePoint网站的Azure注册可能需要做些事情,或者代码与Office 365和SharePoint现在的工作方式已经过时了。

// Assign variables
var variables = {
  // Domain of Azure AD tenant
  azureAD: "tenantname.onmicrosoft.com",
  // ClientId of Azure AD application principal
  clientId: "11111111-1111-1111-1111-111111111111",
  // GUID of SharePoint list
  listId: "22222222-2222-2222-2222-222222222222",
  // Name of SharePoint tenant
  sharePointTenant: "tenantname"
}

// Create config and get AuthenticationContext
window.config = {
  tenant: variables.azureAD,
  clientId: variables.clientId,
  postLogoutRedirectUri: window.location.origin,
  endpoints: {
    graphApiUri: "https://graph.microsoft.com",
    sharePointUri: "https://" + variables.sharePointTenant + ".sharepoint.com",
  },
  cacheLocation: "localStorage"
};
var authContext = new AuthenticationContext(config);
var user = authContext.getCachedUser();
if (!user) {
  authContext.login();
}
// Get OneDrive documents of current user with AuthenticationContext of Graph API 
authContext.acquireToken(config.endpoints.graphApiUri, function (error, token) {
  if (error || !token) {
    console.log("ADAL error occurred: " + error);
    return;
  }
  else {
    var filesUri = config.endpoints.graphApiUri + "/v1.0/me/drive/root/children";

    $.ajax({
    type: "GET",
    url: filesUri,
    headers: {
      "Authorization": "Bearer " + token
    }
    }).done(function (response) {
      console.log("Successfully fetched files from OneDrive.");
      var items = response.value;
      for (var i = 0; i < items.length; i++){
        console.log(items[i].name);
        $("#OneDrive").append("<li>" + items[i].name + "</li>");
      }
    }).fail(function () {
      console.log("Fetching files from OneDrive failed.");
    });
  }
});
// Get SharePoint documents of list with AuthenticationContext of SharePoint
    authContext.acquireToken(config.endpoints.sharePointUri, function (error, token) {
      if (error || !token) {
        console.log("ADAL error occurred: " + error);
        return;
      }
      else {
        var listUri = config.endpoints.sharePointUri + "/_api/web/lists('" + variables.listId + "')/items?$select=Title";

        $.ajax({
        type: "GET",
        url: listUri,
        headers: {
          "Authorization": "Bearer " + token,
          "accept": "application/json;odata=verbose"
        }
        }).done(function (response) {
          console.log("Successfully fetched list from SharePoint.");
          var items = response.d.results;
          for (var i = 0; i < items.length; i++){
            console.log(items[i].Title);
            $("#SharePoint").append("<li>" + items[i].Title + "</li>");
          }
        }).fail(function () {
          console.log("Fetching list from SharePoint failed.");
        });
      }
    });

我可以说该代码确实适用于其余的API和OneDrive。它还可用于从Azure AD获取用户信息。仅当我尝试与SharePoint网站进行交互时,才会出现错误消息。我不确定代码是否与ADAL与SharePoint的交互方式是否最新,或者Azure AD中是否需要配置某些内容。由于与OneDrive的交互似乎有效,因此我认为不是Azure AD的问题(因为我不记得必须在Azure AD中为OneDrive进行任何设置)。

1 个答案:

答案 0 :(得分:0)

错误:AADSTS500011表示您的资源名称错误。或不存在(表示您的管理员尚未同意)

即在您的租户的SP列表中找不到https://my.sharepoint.com/sites/mysite。请注意,资源名称是应用程序注册的应用程序ID URI或SP名称。

确保您已获得管理员同意,并再次检查Sharepoint URL是否正确。

在您提供的链接的第一段中:

  

第一件事

     

确保您的Office 365租户与   您的Azure AD租户。当您的租户关联时,您需要   登录到Azure管理门户并注册您的应用程序   Azure AD租户中的负责人。下一步是启用OAuth   2个隐式授予您的应用程序主体。确保   应用程序主体至少具有“读取用户文件”和“读取项目”   Office 365 SharePoint Online的所有网站集权限   应用。

下面的Git链接的自述文件说明了如何正确创建AAD应用程序注册(旧版)并授予同意并根据文章启用隐式流程:

https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-dotnet-webapi

此链接说明了如何使用v2.0端点执行隐式流:

https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-implicit-grant-flow

尽管对于v2.0终结点,您仍需要使用MSAL.JS作为身份验证库。

基本上,您需要做的是使用带有您的Sharepoint URL的App ID URI创建一个AAD应用程序注册,然后根据文章为其授予权限:

  

至少读取用户文件并读取所有网站集中的项目   Office 365 SharePoint Online应用程序的权限

但是,我想指出的是,这篇文章已经很老了,很多链接都无法正常工作。它所指的大多数资源已过时或不受支持。

请参阅有关如何正确连接到SharePoint以正确实施SharePoint解决方案的官方文档。

https://docs.microsoft.com/en-us/sharepoint/dev/

https://docs.microsoft.com/en-us/sharepoint/dev/spfx/connect-to-sharepoint

https://docs.microsoft.com/en-us/sharepoint/dev/spfx/use-msgraph

https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/guidance/connect-to-api-secured-with-aad

https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/guidance/call-microsoft-graph-from-your-web-part

https://docs.microsoft.com/en-us/sharepoint/dev/spfx/connect-to-anonymous-apis