我正在努力建立一个公司所有员工的电子邮件列表。
这是在Azure上运行的Web应用程序,具有Azure AD身份验证。该应用程序使用.NET Framework 4.6,并使用Microsoft.Owin.Security
包连接到Azure AD。
我可以进行身份验证,我是通过应用注册中定义的角色授权的。到现在为止还挺好。
我可以查看我自己的用户个人资料。这使用Microsoft.Azure.ActiveDirectory.GraphClient
包来构建查询,而不是手动创建HTTPRequests。
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.
“简单”解决方案将“获得更多应用权限”,但这需要大量时间来完成官僚作风。我应该能够收到所有用户的邮件,对吧?
答案 0 :(得分:0)
首先,您不需要对“仅使用有限权限从Azure AD查询基本UserInfo”执行任何特殊操作。您只需查询用户,它就会将您无权访问的任何字段初始化为null
。 Insufficient privileges
表示根本不允许您查看用户。红旗。
起初我以为我的tokencache有问题。它是什么。然后我修好了。仍然是错误。
通过查看Nan Yu链接的online tool在不同应用程序中的几个令牌,我发现我错过了在令牌中查看用户基本配置文件的实际权限。 我仍然没有获得令牌中的权限,并且发现即使选中了“委托权限”下的复选框,之后也没有成功使用“授予权限”选项。
PSA:不要假设所有选中的复选框都是实际授予的。在App Service中检查它具有哪些权限。如果您被公司允许,那就是。