使用Azure AD令牌访问SharePoint Online的应用程序

时间:2017-04-25 11:28:30

标签: sharepoint azure-active-directory adal

如何使用Azure AD获取应用程序令牌以使用应用程序凭据(=没有用户模拟)查询SharePoint?

以下代码非常适合以用户身份查询数据,但我们需要在不模仿的情况下获取信息,例如列出集合中的所有网站,而不管用户权限等。

抛出异常:

  

类型的例外   'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException'   发生在mscorlib.dll中但未在用户代码中处理

     

其他信息:AADSTS70001:标识符为“xxx”的应用程序   在sharepoint.com目录中找不到

获取令牌的代码:

  internal static async Task<string> GetSharePointAccessToken(string url, string userAccessTokenForImpersonation)
            {

            string clientID = @"<not posted on stack overflow>";
            string clientSecret = @"<not posted on stack overflow>";

            var appCred = new ClientCredential(clientID, clientSecret);
            var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.windows.net/common");

            // Use user assetion if provided, otherwise use principal account
            AuthenticationResult authResult = null;

            if (string.IsNullOrEmpty(userAccessTokenForImpersonation))
            {
                authResult = await authContext.AcquireTokenAsync(new Uri(url).GetLeftPart(UriPartial.Authority), appCred);
            }
            else
            {
                authResult = await authContext.AcquireTokenAsync(new Uri(url).GetLeftPart(UriPartial.Authority), appCred, new UserAssertion(userAccessTokenForImpersonation));
            }

            return authResult.AccessToken;
        }

测试代码:

// Auth token from Bearer https://xxx.azurewebsites.net/.auth/me
string authHeader = @"<valid jwt bearer token from azure auth>";
var sharePointUrl = @"https://xxx.sharepoint.com/sites/testsite/";

string sharePrincipalToken = await GetSharePointAccessToken(sharePointUrl, null); // <-- doesn't work
string sharePointUserToken = await GetSharePointAccessToken(sharePointUrl, authHeader); // <-- works

Azure AD中的权限:

Permissions in Azure AD

1 个答案:

答案 0 :(得分:0)

您收到的错误消息暗示您正在使用指向我们令牌服务的用户登录,以便在&#34; sharepoint.com&#34;

的上下文中获取令牌

这是因为你正在使用&#34;普通&#34;端点。详细了解here

而是尝试使用固定端点,其中租户与应用程序注册的位置相同,看看是否能解决您的问题。

如果您的计划是让多个租户可以访问此应用程序,请确保您已明确将应用程序设置为多租户,然后确保您有来自外部租户的用户尝试登录应用程序之前你尝试为服务电话做服务。

如果有帮助,请告诉我。