2017-10-13 114 views
0

我正在尝试构建我们公司所有员工的电子邮件地址列表。 这是在使用Azure AD身份验证的Azure上运行的Web应用程序中。该应用使用.NET Framework 4.6,并使用Microsoft.Owin.Security包连接到Azure AD。仅从Azure AD查询基本UserInfo,权限有限

我可以进行身份​​验证,我受到我在应用程序注册中定义的角色的授权。到现在为止还挺好。 我可以查看我自己的用户配置文件。这使用Microsoft.Azure.ActiveDirectory.GraphClient包来构建查询,而不是手动创建HTTPRequest。

string userObjectID = ClaimsPrincipal.Current 
    .FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, 
    async() => await authorizationHelper.GetTokenForApplication()); 

var result = await activeDirectoryClient.Users 
    .Where(u => u.ObjectId.Equals(userObjectID)) 
    .ExecuteAsync(); 

IUser user = result.CurrentPage.ToList().First(); 

AD计算我的查询,看到它只返回我,并推断我可以查看我自己的信息。执行成功,只返回我。

在不同的页面,我想表明在该公司所使用的邮件地址(标记用户,以预输入,检查所有脑干等),我尝试以下方法:

result = await activeDirectoryClient.Users 
    .ExecuteAsync(); 
return result.CurrentPage 
    .ToList(); 

这失败,“权限不足”。我不允许查看我猜测的整个用户。我的委托权限为“读取所有用户的基本概况”,meaning

允许该应用读取所有用户的基本轮廓在 组织代表登录的用户。以下属性 包含用户的基本配置文件:显示名称,名和姓, 照片和电子邮件地址。

所以,我试图筛选:

result = await activeDirectoryClient.Users 
    .Where(u => u.Mail.StartsWith(str)) 
    .ExecuteAsync(); 
return result.CurrentPage 
    .ToList(); 

但仍然给我整个用户,而我再次击中“权限不足”。所以我尽量

result = await activeDirectoryClient.Users 
    .Where(u => u.Mail.StartsWith(str)) 
    .Select (u => u.Mail) 
    .ExecuteAsync(); 
return result.CurrentPage 
    .ToList(); 

这给神秘的运行时错误(意译来自荷兰)

GenericArguments[1], System.String, Microsoft.Azure.ActiveDirectory.GraphClient.Extensions 
.ReadOnlyQueryableSet.`2[TSource,TISource] conflicts with type TISource. 

而且我很茫然。没有任何源代码似乎可用于ActiveDirectoryClient,而通常的图表API doesn't even mention selecting only basic info.

“简单”的解决方案将是“获得更多的应用程序权限”,但这需要大量时间才能通过官僚作风。而我应该能够获得所有用户的邮件,对不对?

+1

您能否显示'GetTokenForApplication'函数?请尝试使用[在线工具](https://jwt.io/)解码访问令牌并检查'scp'claim中的权限。 –

+0

非常有用,我现在可以比较我从本地工作版本和Web应用版本获得的令牌。我失去了权限,该框被检查但权限从未*授予*。叹。 – Wolfzoon

回答

0

首先,您不需要做任何特殊的事情来“只从Azure AD中以限制权限查询基本UserInfo”。您只需查询用户,它将初始化您无权访问的任何字段,如nullInsufficient privileges意味着你根本不被允许查看用户。红旗。

起初我以为我的令牌缓存有问题。它是什么。然后我修复它。仍然错误。

通过查看Nan Yu与online tool连接的不同应用程序中的多个标记,我发现我错过了在标记中查看用户基本配置文件的实际权限。 我仍然没有获得令牌中的权限,并且发现即使选中“委托权限”下的复选框,之后“授予权限”选项也没有成功使用。

PSA:不要假设所有的选中框都被授予。检查应用程序服务的权限。如果你的公司允许,那就是。