如何通过Microsoft Graph从Azure AD B2C获取用户登录用户名?
如何通过Microsoft Graph从Azure AD B2C获取用户登录用户名?
我完全懂你现在的困扰——明明在Azure AD B2C门户里能清楚看到用户的登录用户名(就是他们注册时用的邮箱),但用Microsoft Graph拉取用户数据时,不仅找不到直接的Username属性,连identities列表都返回null,这确实有点挠头。
咱们一步步来解决这个问题:
首先,先排除权限问题
你已经配置了User.Read.All的应用权限,这个权限是完全足够的,不需要额外添加其他权限,问题不在这。
核心原因:默认请求不会返回identities属性
Microsoft Graph的默认用户查询只会返回一组基础属性(比如id、displayName),而identities属于需要显式请求的扩展属性,如果你不指定要返回它,API就不会把这个字段包含在响应里,所以你拿到的user.Identities自然是null。
解决方案:用$select参数显式请求identities
你只需要在Graph请求中添加$select查询参数,指定要返回identities字段,同时可以保留你需要的其他基础属性。
下面是修改后的代码示例,直接替换你原来的请求逻辑就行:
// 构造查询参数,指定要返回的字段 var selectOptions = new List<QueryOption> { new QueryOption("$select", "id,displayName,identities") }; // 发起请求时带上查询参数 var users = await _graphHelperBl.ApplicationClient.Users .GetAsync(requestConfig => { requestConfig.QueryOptions.AddRange(selectOptions); }); if (users?.Value != null) { foreach (var user in users.Value) { Console.WriteLine(user.Id); Console.WriteLine(user.DisplayName); // 从identities中提取登录用户名 if (user.Identities != null && user.Identities.Any()) { // 找到登录用的身份条目:根据你的B2C配置,这里的signInType可能是"emailAddress"或"userName" var loginIdentity = user.Identities.FirstOrDefault(identity => identity.SignInType == "emailAddress" || identity.SignInType == "userName"); if (loginIdentity != null) { // issuerAssignedId就是用户的登录邮箱/用户名 Console.WriteLine("登录用户名: " + loginIdentity.IssuerAssignedId); } } } }
补充说明:怎么确定正确的signInType?
在Azure AD B2C里,用户的登录身份类型取决于你配置的用户流:
- 如果是邮箱注册/登录的用户流,对应的
signInType是emailAddress,issuerAssignedId就是用户的邮箱地址(也就是你要的登录用户名)。 - 如果是用户名注册的用户流,
signInType就是userName,issuerAssignedId是用户设置的用户名。 - 如果用户用社交账号登录,
signInType会是对应的服务商(比如facebook.com、google.com),你可以根据自己的业务场景筛选对应的条目。
这样修改之后,你就能拿到用户登录用的用户名了,和你在B2C门户里看到的完全一致。
内容来源于stack exchange
相关产品推荐
相关产品推荐

