如何通过外部用户登录身份验证其是否属于指定Entra租户组
问题解答
可以通过MS Graph获取外部成员的登录邮箱地址,你需要调整API请求的查询参数,指定返回用户的**邮件(mail)或其他邮箱(otherMails)**属性,就能拿到用于匹配的登录身份信息。
修改实现的核心要点:
- 调整Graph API请求:在请求URL中添加
$select参数,指定要返回的目标属性(比如mail,otherMails),避免只拿到默认的有限字段。 - 解析邮箱属性:外部用户的
mail字段通常直接对应其登录邮箱;若该字段为空,可从otherMails数组中提取有效邮箱。
修改后的代码示例:
public async Task<List<string>> GetGroupMemberEmailsAsync(string groupName, string accessToken) { var groupId = await GetGroupIdAsync(groupName, accessToken); string ApiUrl = "https://graph.microsoft.com/v1.0/"; // 添加$select参数,指定获取mail、otherMails和displayName属性 var response = await _httpClient.GetAsync($"{ApiUrl}/groups/{groupId}/members?$select=mail,otherMails,displayName"); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); var document = JsonDocument.Parse(responseContent); var root = document.RootElement; var membersData = root.GetProperty("value").EnumerateArray(); var memberEmails = new List<string>(); foreach (JsonElement memberData in membersData) { // 优先读取mail字段(外部用户的登录邮箱通常存在于此) if (memberData.TryGetProperty("mail", out JsonElement mailValue)) { var email = mailValue.ToString(); if (!string.IsNullOrEmpty(email)) { memberEmails.Add(email); continue; } } // 若mail为空,读取otherMails数组中的邮箱 if (memberData.TryGetProperty("otherMails", out JsonElement otherMailsValue) && otherMailsValue.ValueKind == JsonValueKind.Array) { foreach (var emailElement in otherMailsValue.EnumerateArray()) { var email = emailElement.ToString(); if (!string.IsNullOrEmpty(email)) { memberEmails.Add(email); break; } } } } return memberEmails; }
补充说明:
- 你的应用已配置
User.Read.All权限,完全满足获取这些属性的权限要求,无需额外申请。 - 外部用户的
userPrincipalName格式通常为外部邮箱#EXT#@你的租户域名,但你需要的原始登录邮箱,mail或otherMails是更直接的匹配字段。
内容的提问来源于stack exchange,提问作者user3486991
相关产品推荐
相关产品推荐

