仅从Azure AD查询基本UserInfo,权限有限
我正在尝试构建我们公司所有员工的电子邮件地址列表。 这是在使用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.
“简单”的解决方案将是“获得更多的应用程序权限”,但这需要大量时间才能通过官僚作风。而我应该能够获得所有用户的邮件,对不对?
首先,您不需要做任何特殊的事情来“只从Azure AD中以限制权限查询基本UserInfo”。您只需查询用户,它将初始化您无权访问的任何字段,如null
。 Insufficient privileges
意味着你根本不被允许查看用户。红旗。
起初我以为我的令牌缓存有问题。它是什么。然后我修复它。仍然错误。
通过查看Nan Yu与online tool连接的不同应用程序中的多个标记,我发现我错过了在标记中查看用户基本配置文件的实际权限。 我仍然没有获得令牌中的权限,并且发现即使选中“委托权限”下的复选框,之后“授予权限”选项也没有成功使用。
PSA:不要假设所有的选中框都被授予。检查应用程序服务的权限。如果你的公司允许,那就是。
您能否显示'GetTokenForApplication'函数?请尝试使用[在线工具](https://jwt.io/)解码访问令牌并检查'scp'claim中的权限。 –
非常有用,我现在可以比较我从本地工作版本和Web应用版本获得的令牌。我失去了权限,该框被检查但权限从未*授予*。叹。 – Wolfzoon