You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:50:17