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

使用Microsoft Graph从Azure获取用户信息失败求助

问题分析与解决方案

看起来你的自研应用在调用Microsoft Graph获取用户信息时遇到了几个关键问题,我帮你逐一拆解并给出修复建议:

1. 先排查用户缓存为空的情况

你的代码里只有当cca.Users.Count() > 0时才会执行Graph请求,如果这个条件不满足,就会进入空的else分支,直接导致视图没有任何数据输出。可能的原因和解决方法:

  • 检查Token缓存实现:确认MSALSessionCache是否正确从HttpContext的Session中加载缓存数据。可以在代码中添加日志输出signedInUserID和userTokenCache的状态,验证缓存是否正常初始化。
  • 完善else分支的处理:在else块中添加明确的错误提示,方便排查问题:
    else
    {
        ViewBag.Error = "No cached user found. Please re-authenticate.";
    }
    

2. 解析Graph返回的用户数据并赋值到ViewBag

当前代码仅把Graph返回的JSON字符串赋值给ViewBag.Message,但你的视图里期望显示ViewBag.ObjectId、ViewBag.GivenName等字段,这些字段并没有被赋值。你需要反序列化JSON数据并填充对应的ViewBag属性:

// 在获取rez之后添加以下代码
using Newtonsoft.Json; // 需要引用Newtonsoft.Json NuGet包

var userProfile = JsonConvert.DeserializeObject<dynamic>(rez);
ViewBag.ObjectId = userProfile.id;
ViewBag.GivenName = userProfile.givenName;
ViewBag.Surname = userProfile.surname;
ViewBag.UPN = userProfile.userPrincipalName;
ViewBag.MobileNumber = userProfile.mobilePhone;
ViewBag.HomePhone = userProfile.homePhone;
ViewBag.OtherPhone = userProfile.otherMails?[0]; // 根据Graph返回的实际结构调整
ViewBag.UserData = rez; // 保留原始JSON字符串用于调试

3. 完善Claims的空值检查

当前代码中ClaimsPrincipal.Current.FindFirst("preferred_username").Value如果找不到该Claim会抛出空引用异常,建议添加空值保护:

var preferredUsernameClaim = ClaimsPrincipal.Current.FindFirst("preferred_username");
ViewBag.UserName = preferredUsernameClaim?.Value ?? "Unknown User";

4. 验证Azure AD应用注册的配置

即使示例程序能运行,自研应用的注册配置可能存在疏漏:

  • 确认API权限:在Azure AD应用注册的"API权限"页面,确保已添加User.Read的委托权限,并且已经完成权限同意(管理员同意或用户登录时的主动同意)。
  • 检查重定向URI:确保代码中的redirectUri和应用注册里配置的重定向URI完全一致(包括协议、域名和路径,比如https://localhost:44300/signin-oidc)。

5. 优化HttpClient的使用

频繁创建HttpClient可能导致资源泄漏,建议改用依赖注入的IHttpClientFactory来获取HttpClient实例:

// 在Startup.cs中注册IHttpClientFactory
services.AddHttpClient();

// 在控制器中注入
private readonly IHttpClientFactory _httpClientFactory;

public YourController(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

// 在About方法中使用
var hc = _httpClientFactory.CreateClient();

6. 完善错误提示的视图展示

你的视图已经有错误处理逻辑,可以补充重新登录的触发逻辑,当捕获到MsalUiRequiredException时,显示一个登录按钮:

@if (ViewBag.Relogin == "true")
{
    <p class="red">Session expired. Please <a href="/Account/SignIn">sign in again</a>.</p>
}

按照以上步骤调整后,应该能解决你当前看不到用户数据的问题。如果还有问题,可以查看应用的日志,捕获更详细的错误信息,比如Graph请求的响应状态码(比如401、403),这能帮助进一步定位权限或Token有效性的问题。

内容的提问来源于stack exchange,提问作者byronem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:02:43