我正在使用 Azure Graph API,我注意到我无法读取通过许可框架注册的目录。
一切都适用于用户级权限。也就是说,与
private async Task<string> AcquireGraphApiTokenAsync(string objectId, AuthenticationContext authContext)
{
var result = await authContext.AcquireTokenSilentAsync(
GraphUrl, _clientCredential, new UserIdentifier(objectId, UserIdentifierType.UniqueId));
return result.AccessToken;
}
我可以按如下方式读取客户端数据:
var authority = string.Format(CultureInfo.InvariantCulture, AadInstance, tenantId);
var authContext = new AuthenticationContext(authority, new TokenDbCache(userObjectId));
var graphServiceRoot = GraphUrl + '/' + tenantId;
var graphClient = new ActiveDirectoryClient(new Uri(graphServiceRoot), async () => await AcquireGraphApiTokenAsync(userObjectId, authContext));
try
{
var adUser = await graphClient.Me.ExecuteAsync();
...
}
但是,有时我想在守护进程中运行类似的进程,这就是我遇到麻烦的地方。在这种情况下,我需要使用我的应用程序身份:
private void AuditDirectories(ClientCredential clientCredential, IEnumerable<AzureActiveDirectory> directories)
{
foreach (var directory in directories)
{
var authContext = new AuthenticationContext(string.Format(CultureInfo.InvariantCulture, AadInstance, directory.Domain));
var result = authContext.AcquireToken(GraphUrl, clientCredential);
var graphServiceRoot = string.Format("{0}/{1}", GraphUrl, directory.TenantId);
var graphClient = new ActiveDirectoryClient(new Uri(graphServiceRoot), () => Task.FromResult(result.AccessToken));
foreach (var user in _userQuery.Office365Users(directory))
{
CheckThatAccountExistsAndIsEnabled(graphClient, user);
}
}
}
传入clientCredential
参数是从我的多租户应用程序的客户端 ID 和客户端密码中获取的。
我的应用程序具有“读取目录数据”和“启用登录和读取用户配置文件”的委派权限。它具有“读取目录数据”和“读取和写入目录数据”的应用程序权限,尽管我并不真正需要后者。但是,这不允许我查询 Graph API。所有用户查询,例如
graphClient.Users.Where(u => u.DisplayName == userName).ExecuteAsync().Result.CurrentPage.FirstOrDefault()
抛出错误“权限不足,无法完成操作”。
看起来使用用户身份的委派访问没有任何问题,但是使用应用程序身份的访问失败,尽管我已经在应用程序级别设置了应用程序权限。