【发布时间】:2017-10-13 10:56:18
【问题描述】:
我正在尝试建立我们公司所有员工的电子邮件地址列表。
这是在 Azure 上运行的 Web 应用程序中,具有 Azure AD 身份验证。该应用使用 .NET Framework 4.6,并使用 Microsoft.Owin.Security 包连接到 Azure AD。
我可以进行身份验证,我已获得应用注册中定义的角色的授权。到目前为止,一切都很好。
我可以查看我自己的用户资料。这使用 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 似乎没有源代码,常用的 Graph API doesn't even mention selecting only basic info.
“简单”的解决方案是“获得更多应用程序权限”,但这需要大量时间来通过官僚机构。而且我应该能够收到所有用户的邮件,对吧?
【问题讨论】:
-
能否请您显示
GetTokenForApplication函数?请尝试使用online tool 解码访问令牌并检查scpclaim 中的权限。 -
非常有用,我现在可以比较从本地工作版本和 webapp 版本获得的令牌。我缺少权限,已选中该框,但权限从未授予。叹息。
标签: c# asp.net-mvc azure visual-studio-2017 azure-ad-graph-api