如何使用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中的权限:
答案 0 :(得分:0)
您收到的错误消息暗示您正在使用指向我们令牌服务的用户登录,以便在&#34; sharepoint.com&#34;
的上下文中获取令牌这是因为你正在使用&#34;普通&#34;端点。详细了解here。
而是尝试使用固定端点,其中租户与应用程序注册的位置相同,看看是否能解决您的问题。
如果您的计划是让多个租户可以访问此应用程序,请确保您已明确将应用程序设置为多租户,然后确保您有来自外部租户的用户尝试登录应用程序之前你尝试为服务电话做服务。
如果有帮助,请告诉我。