Azure B2C登录后如何通过Microsoft Graph获取用户详情?
问题分析与解决方案
核心问题是你误用了应用权限流(ClientSecretCredential),而获取当前登录用户信息需要使用委托权限流(基于用户登录后的访问令牌调用Graph)。以下是具体解决步骤:
1. 切换到委托权限认证方式
不要使用客户端凭证初始化Graph客户端,而是基于用户登录后拿到的access_token构建认证提供程序。以ASP.NET Core为例:
// 从HttpContext获取用户登录后的访问令牌 var accessToken = await HttpContext.GetTokenAsync("access_token"); // 初始化Graph客户端 var graphClient = new GraphServiceClient( new DelegateAuthenticationProvider(requestMessage => { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); return Task.CompletedTask; }));
2. 配置正确的委托权限
在Azure门户的B2C应用注册中添加Microsoft Graph的委托权限:
- 进入你的B2C应用注册 → 「API权限」→ 「添加权限」
- 选择「Microsoft Graph」→ 切换到「委托权限」分类
- 找到并勾选
User.Read权限(注意是委托权限下的,不是应用权限) - 点击「添加权限」,普通用户登录时会自动完成权限同意(也可由管理员提前统一同意)
3. 调用Graph获取当前用户信息
使用上述初始化的Graph客户端调用/me端点,即可获取当前登录用户的信息:
var user = await graphClient.Me.Request().GetAsync(); // 示例:获取用户显示名、邮箱 var displayName = user.DisplayName; var email = user.Mail ?? user.UserPrincipalName;
为什么之前的方法失效?
ClientSecretCredential属于应用权限流,代表应用本身访问Graph,不存在「当前用户」上下文,因此/me端点报错。- 调用
Users[id]需要应用权限(如User.Read.All)且需管理员同意,这不符合你要获取当前登录用户自身信息的场景。 - 找不到
User.Read权限是因为你之前可能选中了「应用权限」分类,切换到「委托权限」分类即可找到该权限。
内容的提问来源于stack exchange,提问作者bdcoder
相关产品推荐
相关产品推荐

