我正在尝试构建我们公司所有员工的电子邮件地址列表。 这是在使用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.
“简单”的解决方案将是“获得更多的应用程序权限”,但这需要大量时间才能通过官僚作风。而我应该能够获得所有用户的邮件,对不对?
您能否显示'GetTokenForApplication'函数?请尝试使用[在线工具](https://jwt.io/)解码访问令牌并检查'scp'claim中的权限。 –
非常有用,我现在可以比较我从本地工作版本和Web应用版本获得的令牌。我失去了权限,该框被检查但权限从未*授予*。叹。 – Wolfzoon